面試相關的紀錄 === 目前的內容主要針對聯發科的面試 --- ### 自我介紹 - 我是誰 - 我的經歷(轉折點) - 我的動機 - 我可以給你什麼價值 --- ### 上機考 - 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 :::