---
# System prepended metadata

title: 面試相關的紀錄

---

面試相關的紀錄
===
目前的內容主要針對聯發科的面試


---
### 自我介紹
- 我是誰
- 我的經歷（轉折點）
- 我的動機
- 我可以給你什麼價值

---
### 上機考
- reference的用法：int &c= a;   c *= a;
- function pointer和typedef
- bit sequence：要你找出這串數列的連續最長的1bit的長度和他的起始位置
- even odd sort：給你一個n，接下來有n個整數，對他們排序使得 (1) 偶數在奇數前面 (2) 偶數遞減排序、奇數遞增排序 然後輸出這個數列
- 考指標的觀念，還有很多a++、++a，問你輸出多少這種題目，比如說a=3,b=2,a+++b輸出多少？
- pointer相關題目
- linked list相關
- 考你動態分配二維矩陣，而且是要求你用pointer-to-pointer的方式
- bubble sort、string reverse

---
### (專業) 別人被問過的問題
- thread&process的差異
- Big Endian 和 Little Endian是什麼
- IPC (Inter Process Communication)
- Interrupt是什麼？
- TCP/IP跟UDP有什麼差別？ TCP/IP如何知道傳出去的資料對方沒接收到？
- C跟C++有什麼差別
- 物件導向的語言有什麼特性？繼承 封裝 多型是什麼？
- pipe怎麼實作
- 介紹程式的每個section(像是data、 text…等)
- 如果有一個變數型態是pointer-to-pointer那代表什麼？
- c/c++ 的 memory 狀況
- cache 是什麼？什麼時機會用到 cache？ 
- atomic 是什麼？可以怎麼實作？
- pipeline的五個stage（IF，ID，EX，MEM，WB）
- pipeline的hazard種類與其細節
- pipeline設計的好處, data hazard
- pipline越多越好還是越少越好？多的缺點是什麼？
- pipeline，race condition基本概念
- Data Harzard Control Harzard，Structure 
- man in the middle attack以及public keyprivate key的用法


- multi-thread程式寫法
- mutex / semaphore / spinlock
- Thread是怎麼避免Race Condition的？把Code寫出來看看
- multi-threaded 的程式需要注意什麼？怎麼做 synchronization？
- lock 可以如何實作？spinlock、mutex、semaphore 的差異和實作？
- 考慮 single-core single-thread、single-core multi-thread、
- user mode、kernel mode 的差別？trap 是什麼？簡單解釋 system call 流程。
- multi-core multi-thread 不同情況呢？
- 什麼情形要把一個function宣告為static
- 介紹cache coherence
- Driver是什麼？他扮演什麼角色？

---
### (非專業) 別人被問過的問題
- 個人優缺點
    - 英文：自認為英文還有加強的空間，雖然溝通跟閱讀基本上沒問題，但是我覺得溝通可以更流暢，讀寫看可以更好
    - 溝通：有時候會繞了路才說到重點，這部分需要加強
    - 知識範圍：知道廣，但沒有專業的部分，我認為這不是一個好的情況。因為東知道一點，西知道一點的人也不少，畢竟在做一個好的東西出來，發現核心重點，廣是不夠的，必須要專。
    - 實戰：做考試成績好的資優生很簡單，但是實際使用知識，implement跟學校的東西還是有不少的差距。
- 遇到的挫折
- team work的經驗
- 作專題的時候扮演什麼角色？
- 作專題式怎麼分工的？
- 作專題有遇到什麼問題？
- 在team中，你的角色是什麼？
- 為什麼你要來實習or這件公司？
- 你沒有什麼經驗，為什麼我要錄取你？
    - 資深不等於優秀，資淺不等於不會
- 個人優勢
    - 實習：
        - 了解跟接觸過一些工具，知道一些開發的重點，文件寫法
        - trace 系統的code，知道
    - 校內課程：
        - 知道廣，基於這些知識上去上手新東西，速度不會太慢
        - 修課過程中有過不少實作，合作的課，這些課都需要自行設計架構跟製作。我想是有幫助的
    - 研究所：
        - survey過文件，paper，知道通常要抓的重點是什麼，有類似情況時不會那麼沒有方向
        - trace code，發現問題就修改改進的經驗，我想這部分在實習會有幫助

---
### 面試後對面試官可以做的提問
- 對工作內容的詢問
- 對公司願景的詢問
- 為什麼會有這份工作
- 如果上了，在還沒去前，希望我會什麼
- 我缺乏了什麼，我沒上的話，最大原因是什麼
- 對方認為，公司有什麼不好的地方

---
### 面試注意
- 不要故意找藉口隱藏自己缺點，會招來不好的意象，可以用大膽經驗不足來吸引對方興趣
- 自己明顯的缺點被提點了：訴說原因承認缺點之外，並也說對於此缺點做了改善或做了對自己人生有貢獻的事
- 不要不懂裝懂或說話沒有重點
- 當主管問了個題目後，可以把跟這題目所有相關的有系統地全部講述一遍，讓主管知道你了解的深度到哪，而不只有簡單地回答題目本身而已

---
### 面試後，主管給我的建議
- 描述時，可以說明更具體的例子會更好
- 喔太強調喜歡implement了，理論的部分主管就可能會感覺我好像不行
- 我說不太喜歡工作有很多survey，沒有implement。主管說survey你去哪裡都逃不掉，因為沒有 survey，就沒有好的 implement，還有重要的有design，implementation，verification。所以應該要說自己不喜歡survey了一堆東西，然後只是做出一個整理，就沒了的工作。而是喜歡survey了東西，透過那些東西去design或implement出東西的工作。

---
### 網路考古，可參考的內容

- OS
    - http://mropengate.blogspot.com/2017/09/operating-system-concepts.html
    - https://sls.weco.net/CollectiveNote20/OS
    - http://www.csie.ntnu.edu.tw/~swanky/os/index.htm
    - http://morris821028.github.io/2014/04/16/lesson/operating-system-notes/

- 5G
    - http://www.rfwireless-world.com/Terminology/5G-Protocol-Stack-Layer-1-Layer-2-and-Layer-3.html

- 考古
    - http://dummyh.pixnet.net/blog/post/9902458-【c語言】面試考古題-經驗分享---中級
    -    http://mropengate.blogspot.com/2017/08/cc-c.html
    -    https://hackmd.io/s/HkkhJ-ah-

---
## 題目，概念，解答

- 非同步(Asynchronous)與同步(Synchronous)的差異
:::info
Async與Sync的差別在於：發送需求的人是否需要等到需求完成才可以執行其他事情。

你填好單子送到櫃檯，然後……
W：他辦完再叫你的號碼→Async
W：要站在櫃檯等他辦完→Sync

例如有三個指令A、B、C：
Synchronous 的執行順序就會是 A > B > C (須等前一個指令執行完才會執行下一個)
Asynchronous 是它不被前一個指令沒執行完所限制，也就是 A 之後的指令並不會等 A 執行完才開始執行。
:::

- Program / Process / Thread 的差別
[參考1](http://mropengate.blogspot.tw/2015/01/operating-system-ch4-multithread.html)
[參考2](https://dotblogs.com.tw/frankblog/2017/03/06/210644)
:::info
各個 Process 共享 CPU/Memory 的資源
然後 Thread 共享 Process 的資源

Program：
*    放在二次儲存裝置中，尚沒有被Load到記憶體的一堆Code 稱之為「程式」。  (也就是還是死的)

Process：
*    已經被Load到記憶體中，任何一行Code隨時會被CPU執行
*    一個多工作業系統(Multitasking Operating System)可以同時運行多個Process，然而一個CPU一次只能做一件事情，但CPU的數量永遠少於運行中的Process數，因此每個Process使用的時間需要被排程(Scheduling) 

Thread：
*    thread 是 OS 能夠進行運算排程的最小單位，它被包含在 process 之中，是 process 中的實際運作單位。
*    在同一個Process下，由許多Thread所組成
*    一個Process一次只能做一件事情，但可以讓底下的Thread各司其職，例如一個Thread輸入文字，另一個Thread計算文字，對CPU來說兩個都是類似一個Process，因此兩個可以同時做。
![](https://i.imgur.com/p0gRicR.jpg)
:::

- 編譯的方式
[參考1](http://shukaiyang.myweb.hinet.net/cpp/concept.zhtw.htm)
:::info
- C語言：
    - 1. 編譯（compile）：把程式語言轉為 assembly code
    - 2. 組譯（assemble）：把 assembly code 轉成 machine code，產生出object 檔 （如.ojb , .o 為結尾的檔案）
    - 3. 連結（link）：把你的程式、有關的程式和程式庫所產生出來的object file，轉成可以在電腦上執行檔（.exe那些）

- 新一代的編程語言，（例如 Java, C# 等）是先透過翻譯轉成 bytecode，然後再由虛擬機器（Virtual Machine）來執行。
:::

- Big Endian 和 Little Endian是什麼
:::info
![](https://i.imgur.com/4or8EGa.png)
:::

- IPC 介紹
[參考1](https://www.cnblogs.com/CheeseZH/p/5264465.html)
:::success
1. Pipe
    - 数据只能在一个方向上流動 （fd[1]是寫入,fd[0]是讀取）
    - 只能用于具有亲缘关系的进程之间的通信（也是父子进程或者兄弟进程之间）
2. FIFO
    - 可以在无关的进程之间交换数据
    - FIFO有路径名与之相关联，它以一种特殊设备文件形式存在于文件系统中
3. message queue
    - 具有特定的格式以及特定的优先级
    - 进程终止时，消息队列及其内容并不会被删除
    - 可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取
4. semaphore
    - 它是一个计数器
    - 用于实现进程间的互斥与同步
5. Shared Memory
    - 指两个或多个进程共享一个给定的存储区
    - 是最快的一种 IPC，因为进程是直接对内存进行存取
    - 因为多个进程可以同时操作，所以需要进行同步
    - 通常跟semaphore一起用
:::

- interrupt vs trap
:::success

trap：軟體產生
interrupt：硬體產生

interrupt又可以分external或是internal
    - external：CPU以外的周邊元件所發出的，比如I/O complete、I/O error
    - internal：CPU本身所引發的，比如除以0，overflow等等發出的
:::

- 物件導向到底好處，目的是什麼？
:::success
- 在軟體開發環境越來愈複雜下，怎麼有良好的維護呢？
- 物件導向的可重復性，靈活性解決了這個問題
- 讓人更簡單地設計並維護程式，便於分析，設計，理解

- 我的答案：
- 我對個人的理解是，他就是把東西模組化，也就是把一群彼此有相似相依的東西合在一起，變成模組。在這樣的情況下，包出來的東西跟其他東西就有很清楚的分界線，而且這樣讓東西又有可重複使用性。那用這樣的東西去設計，製作系統，就會讓系統很容易維護，很容易讓人理解，很容易設計，很容易分析
:::

- atomic operation
:::success
- 原子操作（atomic operation）意为"不可被中断的一个或一系列操作”
- 原子性不可能由软件单独保证--必须需要硬件的支持
- 比如test_and_set function
:::

- 什麼是指標pointer？
:::success
-  Pointer 是一個可以儲存位址的變數
-  他也只是一個變數，只是這個變數的意義是：指向某個儲存位址
- 所以pointer to pointer是，他是一個可以指向某個address的變數，而他指向的address的內容也是一個address
:::

- critical section
:::success
- Critical sections意指一小塊『用來處理一份被共享之資源』的程式碼
- 它的作用是用於在多執行緒環境中保護資源，而通常這種要受保護的程式區段稱為 Critical Section
:::

- mutex，spinlock，semaphore
:::success
mutex vs spinlock
- Mutex 屬於 sleep-waiting 類型的鎖。
- Spin lock 屬於 busy-waiting 類型的鎖。
- （mutex，spin）兩個只能用在 thread 程式

mutex vs semaphore
- Mutex是一把鑰匙，一個人拿了就可進入一個房間，出來的時候把鑰匙交給隊列的第一個
- Semaphore是一件可以容納N人的房間，如果人不滿就可以進去，如果人滿了，就要等待有人出來。對於N=1的情況，稱為binary semaphore。
- 都是sleep waiting
- semaphore 不只能用在 thread 程式, 兩個不同的 process 也可以用 semaphore 共享資源

其他
- Critical Section 所花費的時間如果不多，適合 Spinlock，因為我們可以減少 Context Switch 的時間
:::

*    register，cache，memory 是什麼？
:::success
程式跑起來就會在 memory 中，所以memory 是運作程式所存在的地方

register 是用來暫時存放資料的地方 Instruction Register 是用來放指令的。那
為什麼不直接對 Memory 中的資料作操作就好了? 
因為在 Memory 內的資料在進行尋找、讀取以及寫入時的速度與 CPU 進行處理的速度相比起來，簡直是天差地遠，若是要直接用 Memory 來做操作，那 CPU 的速度也會跟著被拖慢

那麼要從 Memory 將資料讀進來的時候不也是需要等待嗎? 這就必須提到 Cache 了
它會存下 CPU 可能常用或可能會用到的資料，這樣一來，等到 CPU 需要資料的時候，就可以直接到 cache 裡抓而不用花到時間去連到比較慢的 Memory
:::