职业浅谈(嵌入式软件工程师面试必须知道的)

不知不觉间,自己已经工作一年了。我常常会反思,想想自己当前的价值。而评价自己的价值的最直观的方法,莫过于直接去面试,通过他人的评价然后来反观自己,明确在当前的生活状态下,自己应该往哪个方向努力,怎样才能塑造一个更好的自己。但是在这个过程中,你会发现,有一些事情自己是没有办法改变的,比如说常常会被问,你当前是本科毕业一年,工作经验其实还是非常不足的。因此他们那群人,经常会谈到一个本科五年,研究生三年这个潜规则。或者根据你的学校,跟你谈本三硕二的规则。尤其是在谈到薪资这些重点信息的时候,这一点,更会是面试官或者HR打压你工资的核心借口。我们总说在工作中,核心能力应该成为主要的考核点,这些其他的条条框框不应该作为核心诉求。但是扪心自问,有谁能在刚刚毕业一年时非常有底气地跟人讲自己的成就。所以顺理成章的,这个年限,就成了敲门砖,就像毕业招工作时你的学校一样,都是他们考虑的核心点。但是就应该局限于此了吗?我觉得不然,我觉得应该做的,还是能够让这些面试官相信你的能力,可是怎么才能在短时间内认为你有能力呢?就是能够尽可能好的回答他们面试提出来的各种各样的问题。写本博客的目的,不是为了让自己只是为了面试而准备,不是像应试教育一样来看待这件事情,而是想作为一个指引,让自己不仅仅是局限于当前自己眼前的应用开发,而要拓宽一下自己的视野,明白时代需要什么,工作需要什么,进而更好地提升自己

1.技术考核:一般在求职的过程中,往往需要做个笔试,证明对基础理论有理解以及具备一定的写代码的能力。这个也是自己想写这个博客核心内容。这个也是公司筛选人的第一个阶段,一般的流程就是
价值观测评 --> 技术笔试 --> 初面 --> 技术面 --> 谈待遇 -->发offer。可能不同公司会有所差别。
2.自我介绍:面试官总是会让你来个简单的自我介绍,这样可以给他们看你的简历留出一部分时间,一般我总是先介绍一下姓名,毕业院校,现在已经工作了多久,在公司主要是做什么的。一般我介绍完这些之后,就结束了。其实还可以介绍一下自己曾经经手的项目。
3.项目介绍:会让你从你以前所做的项目中找个印象最深的进行介绍,详细介绍一下在这个过程中你做什么了,怎么做的。可以从项目背景,目标需求,然后实现过程,实际编码这个思路来介绍,也可以来个小总结,稍微有些条理一些。

前面的这些基本说完了,接下来主要就是核心的技术问题了。

  1. 进程和线程的区别
  2. TCP和UDP的区别
  3. TCP/IP的分层,某些协议属于哪一层
  4. sizeof和strlen的区别
  5. 堆和栈的区别以及哪些变量或内存在堆或者栈上
  6. 对Linux的理解
  7. 进程间通信的方式
  8. C语言如何在线程间实现同步和互斥
  9. 字节对齐的问题以及计算
  10. 针对你的项目提出来的各种各样的问题

这一年里,主要做的还是应用层软件的开发与维护,总觉得心里面很浮躁,就是很多底层相关的或者一些基础理论相关的关注度并不高,导致跟一些同行业的前辈交流时觉得有不少问题回答不上来,或者回答的不是很好,可以说,上面的问题已经是非常非常基础的问题了,所以也一定程度地暴露了自己底盘不稳的缺点。其实说白了,自己现在几斤几两心里还是有自知之明的,既然能力现在跟不上自己的野心,所以还是需要静下心来好好学习。

下面逐个先来回答上述的几个问题:
1. 进程和线程的区别:
(1) 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
(2) 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
(3) 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
(4) 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
2. TCP和UDP的区别:
在这里插入图片描述
参考请看:一看就懂系列之 超级详解TCP与UDP
3. TCP/IP的分层,某些协议属于哪一层:
这个可以参考以前自己写的一篇博客总结:TCP/IP协议简介(一)之协议分层
好记性不如烂笔头,很庆幸自己以前将这些东西记录了下来。但是这些东西全都记到心里确实不是一件容易的事情,只能说尽可能把更多的知识点装进脑子里,当然如果有人是需要为面试做准备,这些东西还是尽可能的记到脑子里。尤其是校招,这些都是比较基础的问题,很有可能在面试的时候就被问到了。
4. sizeof和strlen的区别:
(1) sizeof是C/C++中的一个运算符,其作用是返回一个对象或者类型在内存中所占用的字节数。
注意:sizeof后面如果是类型则必须加括号,如 sizeof(char);而如果是变量名则可以不加括号,如 sizeof a; 但是建议使用时 均加上括号。sizeof不能返回动态地被分配的数组的大小。
(2) strlen是C语言中的库函数,所在头文件为#include <string.h>其函数原型为unsigned int strlen(char *s); 其中s为指定的字符串。
注意:strlen只能用char *作为参数,它求的是字符串的实际长度,方法是从开始到遇到第一个’\0’结束。
5. 堆和栈的区别以及哪些变量或内存在堆或者栈上:
堆和栈的区别参考:C语言堆栈入门——堆和栈的区别
一般认为在c中分为这几个存储区

  1. 栈 - 有编译器自动分配释放
  2. 堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
  3. 全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束释放。
  4. 另外还有一个专门放常量的地方。 - 程序结束释放
    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的 “adgfdf “这样的字符串存放在常量区。

6. 对Linux的理解:
这个可以说的内容就多了,但是千万不要说自己不确定的东西,我记得有一次,一个人问我简单谈谈对linux的理解,我竟然说Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的实时操作系统。然后瞬间被打脸了,linux是分时操作系统,在这里简单说一下分时操作系统和实时操作系统的区别是: 分时(Time Sharing)操作系统的工作方式是:一台主机连接了若干个终端,每个终端有一个用户在使用; 实时操作系统(RealTimeOperatingSystem,RTOS)是指使计算机能及时响应外部事件的请求,在规定的严格时间内完成对该事件.常见的一些操作系统的分类:
实时操作系统:uCOS/VxWorks/RTLinux
非实时操作系统:Linux/Windows/OSX
在和别人交谈的时候,如果你不太清楚,可以直白的告诉对方说自己不太了解,但是千万不要说自己不确定的事情,这样只会弄巧成拙,让对方对你的印象大打折扣。
7. 进程间通信的方式:
参照博文:Linux进程间的通信方式和原理
这篇文章总结的很详细了,所以说,勤学习,多总结总结,对自己,对他人都是一种恩惠。哈哈哈
8. C语言如何在线程间实现同步和互斥:
信号量和互斥锁;信号量适用同时可用的资源为多个的情况;互斥锁适用于线程可用的资源只有一个的情况.
互斥锁:互斥锁是用加锁的方式来控制对公共资源的原子操作(一旦开始进行就不会被打断的操作)
(1) 互斥锁只有上锁和解锁两种状态。互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作;只有上锁的进程才可以对公共资源进行访问,其他进程只能等到该进程解锁才可以对公共资源进行操作。
(2) 信号量:信号量本质上是一个计数器,在操作系统做用于PV原子操作;
P操作使计数器-1;V操作使计数器+1.
在互斥操作中可以是使用一个信号量;在同步操作中需要使用多个信号量,并设置不同的初始值安排它们顺序执行
9. 字节对齐的问题以及计算 :
参考文章 : C语言字节对齐问题详解
另外在考察字节对齐的时候,往往会把位域这样的概念引入进来,虽然在现在自己的工作中,很少会真正用到这样的操作,但是作为C语言的基础知识,最好还是了解了解吧。在这里附上一篇菜鸟的教程,留给大家学习 菜鸟教程 C 位域
10. 针对你的项目提出来的各种各样的问题
在面试过程中,他们通常会让你先介绍一下在你以前所做的项目中,自己印象比较深刻的,在这个过程中,记住不要只是介绍这个项目是什么,重点是要介绍在这个项目中,你自己所扮演的角色以及所做的工作内容,可以从项目立项的需求,实际分析,自己的工作思路,实际工作的内容等等角度有条理的来介绍。

最后,希望这篇文章能给大家提供一些帮助,祝工作顺利!

  • 19
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值