# 資訊科技產業專案設計課程作業 3 ### [Résumé](https://drive.google.com/file/d/1xh09G9qawCTkOjRCBTv1oe48IIfTyzvQ/view?usp=drive_link) ## 符合自身興趣/規劃的職務 ### [MediaTek: 軟韌體開發_Embedded System software](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120240902008?returnUrl=%2FeREC%2FJobSearch%3FsortBy%3DWorkExp%26order%3Ddescending%26page%3D4%26searchKey%3Dsystem%26category%3D%26workExp%3D%26branch%3D%26program%3D) :::spoiler 職務描述 資工/資管/電子/電機/電信/通訊/電控相關研究所背景,對行動通訊、無線及寛頻連結、家庭娛樂晶片解決方案有濃厚興趣的2025年應屆畢業生 ::: :::spoiler 應徵條件 資工/資管/電機/電子/通訊相關研究所畢,以及具備以下經驗及專長的你: * 嵌入式系統 (Embedded System) * Computer Organization & Architecture (計算機組織 & 結構) * 作業系統 (Operating System) * 資料結構 (Data Structure) * 程式語言 (Programming Language) * RTOS (Real-time Operating System) * Linux * Android ::: ### [MediaTek: CPU platform software engineering](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120240513000?returnUrl=%2FeREC%2FJobSearch%3FsortBy%3DWorkExp%26order%3Ddescending%26page%3D1%26searchKey%3Dsystem%26category%3D9020%26workExp%3D0011%26branch%3D0000009256%26program%3D) :::spoiler 職務描述 1) Define real-time CPU and system architecture for 5G modem 2) Develop RTOS, memory management and system related services. 3) Develop systematic methodology, CPU and platform simulators for system performance evaluations. 4) Analyze software behaviors and enhance system performance. 5) Develop the drivers and boot-up flow for CPU and systems. 6) Develop automatic tools to diagnose system level issues. 7) Analyze big data from system or process behavior to drive teams for directions of improvement ::: :::spoiler 應徵條件 1) Strong C programming skill. With C++/SystemC/Python programming skill is a plus. 2) Following Experience is a plus: Controller, CPU, Driver, Kernel (for any RTOS) or embedded system development. 3) Good at AI tools, data analysis, Excel, Powerpoint and presentation skill is a plus. ::: ### [RealTek: 軟體工程師 (Embedded System/Machine Learning/Compiler)](https://recruit.realtek.com/Job/JobDetail?jobid=717) :::spoiler 應徵條件 * 碩士以上電機資訊相關科系畢 * 有下列經驗者佳: * 熟悉 C/C++、Python 等程式語言 * 熟悉 compiler 設計 (GCC/LLVM)及toolchain (assembler, C library, debugger) * 熟悉 embedded system 開發 (如Android, embedded Linux or RTOS等) ::: ### [Google: Software Engineer](https://www.google.com/about/careers/applications/jobs/results/137721392706527942-software-engineer-university-graduate-2025) ::: spoiler 職務描述 Our products need to handle information at massive scale, and extend well beyond web search. We're looking for engineers who bring fresh ideas from all areas, including information retrieval, distributed computing, large-scale system design, networking and data storage, security, artificial intelligence, natural language processing, UI design and mobile; the list goes on and is growing every day. As a software engineer, you will work on a specific project critical to Google’s needs with opportunities to switch teams and projects as you and our fast-paced business grow and evolve. ::: ::: spoiler 應徵條件 #### Minimum qualifications: * Bachelor's degree in Computer Science, related technical field, or equivalent practical experience. * Experience in computer science, data structures, algorithms, and software design. * Experience in Software Development and coding in a general purpose programming language. #### Preferred qualifications: * Master's degree or PhD in Computer Science or a related technical field. * Experience programming in C, C++, Java, or Python. * Experience with Unix/Linux or Windows environments, distributed systems, machine learning, information retrieval, and TCP/IP. ::: ## 個人簡歷 & 自我分析 ### 學歷背景 * 國立聯合大學資訊工程學系[進修學士班](https://zh.wikipedia.org/zh-tw/夜校) * 國立成功大學資訊工程研究所(就讀中) ### 劣勢 :::danger * 非純血頂大電資,且大學讀的還是夜校。 * 缺乏 Linux、RTOS kernel、Embedded System、Device Driver 等開發經驗。 * 對 compiler 設計 (GCC/LLVM) 及 toolchain (assembler, C library, debugger) 很陌生。 * C/C++ 指標還不夠熟悉,Python、Java 也不會。 * 程式能力待加強(Leetcode 解還不到 100 題)。 * 英文能力不足。 ::: ### 優勢 :::success * 具備電資學/碩士以上之學歷。 * 在準備研究所考試期間,研讀了**資料結構**、**演算法**、**作業系統**和**計算機組織**等相關書籍,具電腦科學的基礎知識。 * 精通中文、客語。 ::: ## 面試題目 ### 作業系統 * Process & Thread 的差別? > Process 是 OS 分配 Resource 的單位,而 Thread 是 OS 分配 CPU-time 的單位。 > Process 之間的溝通相對複雜, 一種方法是跟 OS 要一塊 Shared Memory,不過這種方法就要注意 Race condition 的問題;另一種是透過 OS Message passing。 > 而 Thread 之間的溝通相對簡單,只要透過 Global Variable 即可(共用於 Stack 中),雖然可能會有些問題(Race Condition)不過整體是比較簡單的,再者 Thread 的切換可能不用轉到 Kernel Mode(看 Thread 如何實作) 又 Process 切換需要儲存許多資料到 PCB 而 Thread 相對較少,所以 Thread 的 Context Switch 也比 Process 快。 * 什麼是 Race Condition ? > 共享變數的最終結果値,會因 Processes 之間執行順序的不同而有所不同。 * 什麼是 Operating System ? > 確保 Process 可以正確執行,不會讓 Process 跟 Process 之間互相干擾,並透過 Dual-module 的機制保護硬體,並提供 high level 的 system call 讓使用者不能直接操作硬體,簡化操作,也更加有效率等。 * 作業系統中,什麼是priority inverse ? > 如果低優先權 Process 目前持有一些sharable kernel Data structures 或 Resources,且受到互斥存取機制保護時,當高優先權 Process 到達,且 **preempts it's CPU** 執行,此時若高優先權 Process 執行時也需要用到這些 sharable kernel Data structures 或 Resources,則會因為這些Data Resources 被 locked (因為有互斥存取機制),導致高優先權 Process 仍無法存取,形成**高優先權等待低優先權 Process** 釋放這些 sharable Data structures / Resources 的情況,再加上低優先權 Process 又遲遲無法取得 CPU (因為有一群 Processes 優先權比低優先權 Process 高)來完成對共享 Data/Resource 之使用,進而釋放出 CPU,造成高優先權 Process 等待時間非常久。 ### 計算機組織 * 什麼是pipeline? 用pipeline有什麼好處/壞處? > 是讓計算機裝置能夠在單位時間內能執行多個指令而設計的技術,以提高系統的 Through Put。但當遇到 hazards 時,就會需要更多複雜的硬體來處理,例如:Data Hazards 以及 Control hazards。 * 什麼情況下會產生 stack overflow,如何避免 ? > **Recursive** without break/stop. * 講解一下什麼是 (Pipeline) Hazard ? > 分三種,Structural hazards, Data hazards, Control hazards。 > Structural hazards: 硬體資源不夠多而導致同一時間內要執行的多個指令無法執行,是先天限制,如:記憶體一次就只能給一個人讀取。 > Data hazards: 會發生在 lw 後面直接接 add 或是 branch 等,在資料就緒之前就要使用,就會出現 Data hazards。在連續數個指令都存取同一個暫存器時可能會發生的 Race Condition。會造成執行時 read/write 指令的順序與在組語之中的順序不同。Data Hazard 又分為 RAW, WAW, WAR 三種,其中以 RAW 最為常見。 > Control hazards: 當我們需要用到 jump / branch 指令來更改 PC (Program Counter)時,但這個指令仍在執行中,還無法得知要不要跳,此時 Pipeline 仍持續的在抓取下ㄧ行指令,此時就有可能導致抓錯指令的問題(若判斷是要跳,則後面的指令就全抓錯了)。 * 講解一下什麼是 memory hierarchy ? > 是一種使用多層次記憶體的結構,隨著與處理器距離的增加,記憶體的容量也會增加,且每層皆為下一層之子集合。 > **這樣設計的目的是增加記憶體存取的效率。** ### C 語言 * struct 跟 union 的差別? > struct 可以包含多種 data type 的成員,而且每個成員都有獨立的記憶體空間。union 與 struct 最大差別就是 union 所有成員共用同一塊記憶體,所以 union 的大小會是最大成員的大小。 * Global 直接宣告參數不給值,跟 function 裡面宣告參數不給值,直接印,會印出什麼? > Global: 0 function: stack 殘存值 * 兩個 string 還是 char 陣列,分別丟同樣的字串,問如果直接 `==` 會是什麼結果?true 或 false 或 不能編譯? > 陣列存的是pointer,若指向的位址不同則會 false #### Reference * [軟韌體工程師面試心得](https://hackmd.io/@Vf4G8I7ARmuQvRAdL7VDLw/Syh_RT4Hs) * [面試整理](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE?type=view) * [MTK 考古題整理](https://hackmd.io/@tcfsh22215/r1HUVEHqS) ## 模擬面試問答 > 🤠:interviewer > 🤔:interviewee 🤠:您好,歡迎來參與這次的面試,接下來我需要了解您的背景知識是否有符合我們公司的要求。請問什麼是 Operating System?它的用途是什麼? 🤔:作業系統是硬體與使用者之間溝通的介面,同時也具有資源分配以及確保 Process 可以正確執行,不會讓 Process 跟 Process 之間互相干擾的角色,透過 Dual-module 的機制保護硬體,並提供 high level 的 system call 讓使用者不能直接操作硬體,簡化操作,也更加有效率等。 🤠:那系統中 Thread 與 Process 的差異為何? 🤔:Process 是 OS 分配 Resource 的單位,而 Thread 是 OS 分配 CPU-time 的單位。 🤠:那在資料溝通上的差別呢? 🤔:Process 之間的溝通相對複雜, 一種方法是跟 OS 要一塊 Shared Memory,不過這種方法就要注意 Race condition 的問題;另一種是透過 OS Message passing。而 Thread 之間的溝通相對簡單,只要透過 Global Variable 就是共用於 Stack 中的變數,雖然可能會有些問題,像是Race Condition,不過整體是比較簡單的,再者 Thread 的切換可能不需要轉到 Kernel Mode,要看 Thread 是如何實作的。另外,Process 轉換需要儲存許多資料到 PCB 而 Thread 相對較少,所以 Thread 在做 Context Switch 也會比 Process 快。 🤠:好,您剛剛有提到 Race Condition,請問什麼是 Race Condition 呢 ? 🤔:就是共享變數的最終結果値,會因為 Processes 之間的執行順序不同而有所不同。 🤠:在電腦的發展過程中,隨著計算機架構的不斷進步而逐漸演變出 Pipeline 技術,請問什麼是 Pipeline?用 Pipeline 有什麼好處/壞處? 🤔:是讓計算機裝置能夠在單位時間內能執行多個指令而設計的技術,可提高系統的 Through Put。但當遇到 hazards 時,就會需要更多複雜的硬體來處理,例如:Data Hazards 以及 Control hazards。 🤠:請您順便介紹一下 Pipeline 中的 Hazards? 🤔:Pipeline 中的 Hazards 又分成三種,Structural hazards 跟 Data hazards 還有 Control hazards。 > Structural hazards: 硬體資源不夠多而導致同一時間內要執行的多個指令無法執行,是先天限制,如:記憶體一次就只能給一個人讀取。 Data hazards: 會發生在某指令的**來源暫存器**與上一指令的**目的暫存器**相同,此時就會出現 RAW (Read After Write) Data hazards,即該指令的**來源暫存器**的值,與預期的值不同。Data Hazard 又分為 RAW, WAW, WAR 三種,其中以 RAW 最為常見。 Control hazards: 當我們需要用到 jump / branch 指令來更改 PC (Program Counter) 時,但這個指令仍在執行中,還無法得知要不要跳,此時 Pipeline 仍持續的在抓取下ㄧ行指令,此時就有可能導致抓錯指令的問題,若判斷是要跳,則後面的指令就全抓錯了。 🤠:好,最後想了解您對 C 語言的熟悉度,請問 struct 跟 union 的差別? 🤔:struct 可以包含多種 data type 的成員,而且每個成員都有獨立的記憶體空間。而 union 與 struct 最大差別就是 union 所有成員共用同一塊記憶體,所以 union 的大小會是最大成員的大小。 🤠:Cool,那在程式的 Global 區塊直接宣告參數不給值,跟在 function 裡面宣告參數不給值,直接印,會印出什麼? 🤔:Global 是 0,function 是 stack 的殘存值。 🤠:好,最後一個問題,給予兩個 string 或 char 陣列,分別丟同樣的字串,問如果直接 `==` 會是什麼結果?true 或 false 或 不能編譯? 🤔:陣列存的是字串中第一個元素的 pointer,因此,若給予的兩個字串指向的位址不同,則會回傳 false。 🤠:好,感謝您參與這次面試,這邊會再請人資通知您面試結果。