楼主前段时间报了培训班学了嵌入式开发.
我知道有很多人对培训班出来的有很大意见,比如伪造简历,吹得天花乱坠却连计算机基础知识都不知道,我在培训班里看到有些同学学的非常差和老师叫我们包装简历时也能感受到这种行为对这个行业的破坏.但我大学专业就是计算机科学与技术,虽然有些科目没怎么学,但自己感兴趣的科目还是学的非常好的,而且我工作后就一直从事 linux 方面的工作,c 基础也非常好.我写简历就是实话实说,有什么写什么.
linux 应用层开发的面试,面试官一般会问哪些具体的问题?会问我一些函数的各个参数吗?有些函数的参数我记不住了,但原理清楚,参数必须看手册和笔记我才能想起来.
我以前没什么开发的项目经验,不过 shell 脚本和 c 的小程序第一份工作时也经常写,我自己写了两个应用层的程序,一个用高级 io+多线程实现的数据处理程序,另外一个用了很多零零碎碎的知识做了一个和同学开玩笑的程序,不知道能不能写到简历上,两个程序的代码如下: https://github.com/owlli/epoll_pthread https://github.com/owlli/trick
1
lovefantasy 2018-09-15 15:27:36 +08:00 via Android
我觉得不行
|
2
AngelCriss 2018-09-15 15:29:54 +08:00 via Android
看了下你那个 server.c,既然用了事件循环,为啥还要为每一个连接新开一个线程?
|
3
inoki 2018-09-15 15:30:02 +08:00 via Android
算法+数据结构
|
4
AngelCriss 2018-09-15 15:31:07 +08:00 via Android
@lovefantasy 我也觉得不行。。
|
5
lolcat OP @lovefantasy 能给出一点求职建议吗?谢谢.
|
6
lolcat OP @AngelCriss 让新线程处理客户端发送过来的数据啊,我这里的处理方法只是把数据打印出来,如果其他处理方法,可能会处理很久,我不能让进程一直阻塞在那啊
|
7
AngelCriss 2018-09-15 16:04:57 +08:00
@lolcat
如果你的任务不是 CPU 密集的,比如死循环,就没有必要这么做。 你可以把这些连接设置成非阻塞的加到事件循环里面,每个链接绑定一个回调,如果只是 ping/pong 这种,每次可读或可写的时候就执行这个回调就行了,如果有上下文,还需要和这个连接绑定。 这是一个很基础很常见的模型。 |
8
lolcat OP @AngelCriss 假如我需要把接受到的数据存到数据库,数据库非常慢,插入一次数据要 1 秒,如果不用多线程,我那 1 秒不就阻塞了吗?
|
9
xeaglex 2018-09-15 18:16:30 +08:00
楼主,他说的是非阻塞模型,实现原理上也是利用多线程,但效率比你的高。
|
10
lolcat OP @xeaglex 还是不太理解
@AngelCriss 说的模式,我也是用的非阻塞模型啊,能详细介绍下吗?我的是一旦 bind 的 socket 可读,就取出连接队列里的 socket 并加入 epoll 监视队列,如果是新建的 socket 可读,就新建新线程从这个 socket 里读数据 |
11
qwertyssp 2018-09-15 18:40:36 +08:00 via Android
啥也不会问,就问以前做过什么
|
12
meik2333 2018-09-15 18:49:16 +08:00
读写的事件也可以扔 epoll 跑的,读写事件是交给内核处理的,这些时间程序是可以利用起来的。
|
13
AngelCriss 2018-09-15 18:59:14 +08:00 via Android 1
|
14
xvrzhao 2018-09-15 19:47:02 +08:00
@lolcat 可以参考一下 libuv 的设计,https://libuv.org
|
15
lolcat OP @AngelCriss 非常感谢.但是我 c++语法不是太懂,不过还是把程序大致架构看懂了.你是将新建的 socket 放到线程里用 epoll 监控吗?我是把新建的 socket 添加到进程的 epoll 队列里监控,这应该是我俩程序最大的不同吧?
你的程序倒数 17 行,应该可以不用 for 循环吧?因为 epoll 默认工作在 lt 模式,在 lt 模式下,只要监控的文件描述符为可读,epoll_wait 就会一直触发. |
17
AngelCriss 2018-09-16 00:01:41 +08:00 via Android
@lolcat 不好意思,你这 3 个问号的回答都是否定的。
回到正题,这个帖子的回答就是 3 楼说的。另外,楼主可能需要系统的学习下网络编程,而不是只知道系统调用怎么用就行。 |
18
lolcat OP @AngelCriss 请问能简单介绍下你是如何监视 accept 后得到的套接字吗?我非常想把自己写的程序优化下,谢谢.
|
21
realpg 2018-09-16 09:42:47 +08:00
报了培训班 即使科班出身 也基本定调了 感觉写不出靠谱代码的……
根本心不在此 舍不得自己钻研 走自认的捷径培训班 |
23
lolcat OP @meik2333 嗯,我是把 accept 得到的 socket 加入到进程的 epoll 队列里监听,有人是把 accept 得到的 socket 传到线程里,在线程里用 epoll 监听,您觉得哪种方式好?
|
25
neoblackcap 2018-09-16 20:08:14 +08:00
@meik2333 nginx 我看了可是 One thread one loop。虽然都是 epoll,但是 worker 的 epoll 跟 master 的 epoll 不是一个实例
|
26
meik2333 2018-09-16 22:02:07 +08:00
@neoblackcap 我并没有实际看过 Nginx 的源码,只是看过《深入理解 Nginx 》,所以可能有误差,不好意思了。
我之前看的 Nginx 的模型是父进程 listen,然后将套接字传给子进程;对每个子进程来说,accept 或者 read、write 等都是添加到 epoll 监听的。 我之前还看到在某些系统上 Nginx 采用的是线程模型,对于那些我也没有了解。不管怎样,还是感谢指正了。 |
27
neoblackcap 2018-09-16 22:48:34 +08:00
@meik2333 你说的就是我说的,每个线程独自有一个 epoll 实例。你 master 里面的 epoll 监听的事件,是不会触发 worker 的 callback 的。意思就是这个意思。
这个我也是从陈硕的《 Linux 多线程服务端编程》里面看到的。加上自己看过一下 nginx 早期版本的代码。处理好网络 IO 剩下就是本地磁盘 IO 这些,这个 nginx 优化还真是厉害 |
28
zeromake 2018-09-17 07:18:02 +08:00 via Android
话说嵌入式没工作经验怎么找工作?
|
29
zeromake 2018-09-17 07:23:38 +08:00 via Android
话说两年前我是培训的,当时和朋友聊天说到那个培训机构里还有 3,4 个培训嵌入式的培训完大半年还没找到工作的。
|