分类目录:摩登3平台开户

摩登3咨询:_你这么努力,为什么能力提升还这么慢?

成长&认知 丨 作者 / 袁吴范 这是pointers公众号分享的第20篇原创文章 今天是周六,杭州又是一个阳光明媚的好天气。晒着暖暖的太阳,给大家来一篇。 你是否经常陷入苦恼,为什么明明工作已经非常努力了,但是能力提升还是很慢? 总是羡慕别人那么的优秀,对他们为何优秀却丝毫不知。 最后只能简单地把这一切归因于牛人对我们的智商碾压。 请你耐心看完文章,相信我,你会有大收获。     —  1   — 能力跃升 在学生时代的时候,老师总是教我们你要你好好学习,成绩不会差的。 在职场中,你的领导总是会告诉你,只要努力工作,你的能力就会提升。 最终,大家的能力天差地别,我们总是会归因于智商碾压,运气好,机会多。 如果我们能够认真的分析,就会发现智商真的给他们提供了多少先发优势吗? 能起到决定性的作用吗? 其实真的没有你想象的那样大的差距,那些现在春风得意的牛人们,跟你我一样,都有懵懂的职场初级阶段。 但是几年后,那些优秀的人在能力和认知水平上可能会是普通人的成百上千倍,甚至更多。 强者越强,弱者越弱,个人能力发展的“马太效应”初显,这一切到底是为什么? 真正的原因是由于那些优秀人才长期坚持不懈地积累,他们的能力和认知水平相比我们普通人已经先行进入了指数增长的阶段。 你还否定自己的智商吗? 还在为自己找借口吗? 最后一句送给你:继续努力,静待花开! —  2   — 认知收益和成本 举一个例子。 假定2个人设,你和小明,小明是一个整天不学无术,就知道好吃懒做,没有任何想法,大脑时常空白。 而你,精通Linux内核,对计算机原理了如指掌,各种计算机语言烂熟于心。 你们两个人同时要开发一个简单的局域网聊天软件。 这个任务对于没有任何计算机知识的小明来说,简直无从下手。无奈之下,小明只能照搬互联网上的别人写的代码,艰难完成初步开发,然后一个更加残酷的问题接踵而至,运行期间发生的bug,对于小明来说简直就是天书,他自己是无法独自解决的,他就会花费大量时间,寻找帮手解决,但又不知道其原理,就这样一直在发现问题,艰难解决问题的循环中前进。 这个任务对他来说毫无疑问就是一个高成本低收益的事情。   反观你自己,情况则完全不同。首先你有自己的知识体系,能够经过自己的详细设计、认真编码、仔细测试,最终轻松并且迅速的完成了任务,这个任务对你来说,毫无难度,就是一个低成本高收益的事情。   通过这个例子,可以清晰的发现。 初期在一定的时间内,你付出的努力之后的效果和收益是不明显的。 就像你学习Linux内核,需要学习计算机原理、计算机语言等等,这些需要大量的前期努力。 但当你的知识和能力积累到一定层次之后,你对新知识的认知成本会急剧下降,也就说你的学习过程会越来越轻松。 你的认知收益还会迅速上升,也就是例子中的你,轻松的完成了这个开发任务。 在外人看来就是说你越来越聪明了。 这样此消彼长的双重影响下,收益与成本的比值会急剧的增大。 所以,你会发现,你身边的牛人大多有坚持和专注的品质。 因为你做一件事情你会越来越轻松,而且收益会越来越大,何乐而不为呢? 这才是我们和那些“牛人”之间从本可以望其项背到后来与之判若云泥的客观发展过程。   上面的例子虽然现实中不太可能,但是事实却是如此。 以我自己为例,由于大学期间,打了四年的游戏,直到毕业,才发现身无所长,最终痛下决心,挑灯奋战学习持续2年。好在我自己深知能力积累的“非线性增长”规律,所以也并没有过于气馁和急躁。终于进入海康之后,仿佛是一瞬间被打通了任督二脉,厚积薄发,职场中一路飙升。 这就是认知成本与认知收益叠加之后的力量。 造成我们和优秀同事之间的能力巨大鸿沟的决定性因素其实是“知识能力”积累到一定程度带来的自身增值速度。     —  3   — 认知收纳和建立链接 这时候的你认识到了积累的重要性了。 但是对不起,即便是你日以继夜的积累,也可能达不到能力提升的目的。 最好还差一步,就是缺乏系统思维。 你通过长期积累的知识并没有纳入到你自己的知识体系中去,他们还只是单纯的孤立的知识点。 我们的记忆本质就是记忆逻辑,也就是记忆关联。 我们需要将新知识和已有的认知进行连接。 这样才能达到融会贯通,才能达到信手拈来的程度。 那如何培养自己的系统思维呢? 我自己的学习方式是每当我学习到一个全新知识的时候,我会去思考这个知识点与我脑中现有的知识系统有何联系。然后再去想,我该去如何使用这些知识。 打一个比方。 我们学习数据结构的时候,其中有链表,二叉树等等,这时候你就要去想,这些数据结构是怎么使用的?在你的工作中哪些地方可以用到。跟你脑中的已经学习到的例如Linux内核有关系吗?是不是Linux内核中也使用这些数据结构?内核中为什么要这样使用的? 通过这一番深度思考之后,是不是对知识的理解更加深刻,也就真正成为了你自己的东西了。   再仔细想想为什么常常我们道理都明白,却很难做到? 其实很多时候我们都犯了一个巨大的错误,那就是误把“知道”当作“明白”或者“感悟”。   想知道,道理很容易,那些祖训大家都耳熟能详,但往往真正明白并内化到自己的骨子里却需要付出不少的精力。 所以,再看极少数身边优秀的人,在年轻时就能把这些有价值的道理真正内化到了自己的行动上,不得不说这才是他们身上一直被人们忽略的最大的天赋。   —  4   — 突破舒适区   上个月和老同学们续了叙旧,转眼间已经毕业7年了。 有些同学已经发生了天翻地覆的变化。以前向我借10块还没还的同学,大学期间,每天7点起床,迅速的洗漱完,背上书包,就去实验室,敲代码,练习编程题目,准备参加竞赛。现如今已经自己创业,创立了自己的竞赛培训机构。目前已经基本财务自由。 有些同学经历了考研,目前在华为、网易等大公司里比较基层的岗位工作着。 短短几年之后,职业发展的轨迹就已经天差地别。   如果你还在满足于当前的得过且过状态,你身边的同事们正在暗暗较劲,拼劲学习,努力积累经验。此时将你们进行横向对比,确实差别不大。正所谓逆水行舟不进则退,倘若再过几年呢? 在认知收益和认知成本比值不断增大的情况下,在温水煮青蛙的状态中,在你还没有意识到时,对方能力的已经把你甩的老远。   此时,对方已经开始崭露头角,领导的资源就慢慢向他倾斜。那时,你该如何是好呢? 不要在本该奋斗的年纪选择安逸,那样以后的路越来越难走。天底下没有速成的秘诀,没有捷径可走。  时刻保持危机感,设立高标准,严格要求自己。 当你学会了走路,就要想学着跑步,当你学会了跑步,就要想着到水里,学着游泳。 总之,do it now!   —  5   — 最后的总结   你们可以尝试从认真对待眼前的工作做起,为自己未来的每一年制订一个切实可行的工作与学习计划,早日踏上能力积累的道路,别到明年此时,再言当初若是。 你要相信,能力是存在跃升,只是时间未到,多点耐心。 你要相信,认知收益和成本会急剧的增大,要多积累。 你要对自己的认知进行整合,建立认知链接,打造自己的知识体系。 你要对自己狠一点,谨防陷入舒适区,时刻保持危机感,这是生存法则。 所以,你知道你和牛人的差距了吗? 最后,送给大家一句话:种一棵树最好的时机是10年前,其次就是现在了。 推荐阅读(干货) 程序员如何打造个人品牌? 面试过200人的经验,都在这里了…

摩登3注册网站_Linux内核信号量

概念 Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,因此他和System V的IPC机制信号量毫不相干。 如果有一个任务想要获得已经被占用的信号量时,信号量会将其放入一个等待队列(它不是站在外面痴痴地等待而是将自己的名字写在任务队列中)然后让其睡眠。 当持有信号量的进程将信号释放后,处于等待队列中的一个任务将被唤醒(因为队列中可能不止一个任务),并让其获得信号量。这一点与自旋锁不同,处理器可以去执行其它代码。 应用场景 由于争用信号量的进程在等待锁重新变为可用时会睡眠,所以信号量适用于锁会被长时间持有的情况;相反,锁被短时间持有时,使用信号量就不太适宜了,因为睡眠、维护等待队列以及唤醒所花费的开销可能比锁占用的全部时间表还要长。 举2个生活中的例子: 我们坐火车从南京到新疆需要2天的时间,这个’任务’特别的耗时,只能坐在车上等着车到站,但是我们没有必要一直睁着眼睛等,理想的情况就是我们上车就直接睡觉,醒来就到站(看过《异形》的读者会深有体会),这样从人(用户)的角度来说,体验是最好的,对比于进程,程序在等待一个耗时事件的时候,没有必须要一直占用CPU,可以暂停当前任务使其进入休眠状态,当等待的事件发生之后再由其他任务唤醒,类似于这种场景采用信号量比较合适。 我们有时候会等待电梯、洗手间,这种场景需要等待的时间并不是很多,如果我们还要找个地方睡一觉,然后等电梯到了或者洗手间可以用了再醒来,那很显然这也没有必要,我们只需要排好队,刷一刷抖音就可以了,对比于计算机程序,比如驱动在进入中断例程,在等待某个寄存器被置位,这种场景需要等待的时间往往很短暂,系统开销甚至远小于进入休眠的开销,所以这种场景采用自旋锁比较合适。 关于信号量和自旋锁,以及死锁问题,我们后面会再详细讨论。 使用方法 一个任务要想访问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1,若当前信号量的值为负数,表明无法获得信号量,该任务必须挂起在 该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数,表示能获得信号量,因而能即时访问被该信号量保护的共享资源。 当任务访问完被信号量保护的共享资源后,必须释放信号量,释放信号量通过把信号量的值加1实现,如果信号量的值为非正数,表明有任务等待当前信号量,因此他也唤醒所有等待该信号量的任务。 内核信号量的构成 内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。只有在资源被释放时,进程才再次变为可运行。 只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。 内核信号量是struct semaphore类型的对象,在内核源码中位于include\linux\semaphore.h文件 struct semaphore{    raw_spinlock_t        lock;    unsigned int        count;    struct list_head    wait_list;} 成员 描述 lock 在2.6.33之后的版本,内核加入了raw_spin_lock系列,使用方法和spin_lock系列一模一样,只是参数spinlock_t变为了raw_spinlock_t count 相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源 wait_list 内核链表,当前获得信号量的任务会与该成员一起注册到等待的链表中 信号量的API 初始化 DECLARE_MUTEX(name) 该宏声明一个信号量name并初始化他的值为1,即声明一个互斥锁。 DECLARE_MUTEX_LOCKED(name) 该宏声明一个互斥锁name,但把他的初始值设置为0,即锁在创建时就处在已锁状态。因此对于这种锁,一般是先释放后获得。 void sema_init (struct semaphore *sem, int val); 该函用于数初始化设置信号量的初值,他设置信号量sem的值为val。 注意: val设置为1说明只有一个持有者,这种信号量叫二值信号量或者叫互斥信号量。 我们还允许信号量可以有多个持有者,这种信号量叫计数信号量,在初始化时要说明最多允许有多少个持有者也可以把信号量中的val初始化为任意的正数值n,在这种情况下,最多有n个进程可以并发地访问这个资源。 void init_MUTEX (struct semaphore *sem); 该函数用于初始化一个互斥锁,即他把信号量sem的值设置为1。 void init_MUTEX_LOCKED (struct semaphore *sem); 该函数也用于初始化一个互斥锁,但他把信号量sem的值设置为0,即一开始就处在已锁状态。 PV操作 获取信号量(P) void down(struct semaphore * sem); 该函数用于获得信号量sem,他会导致调用该函数的进程睡眠,因此不能在中断上下文(包括IRQ上下文和softirq上下文)使用该函数。该函数将把sem的值减1,如果信号量sem的值非负,就直接返回,否则调用者将被挂起,直到别的任务释放该信号量才能继续运行。 int down_interruptible(struct semaphore * sem); 该函数功能和down类似,不同之处为,down不会被信号(signal)打断,但down_interruptible能被信号打断,因此该函数有返回值来区分是正常返回还是被信号中断,如果返回0,表示获得信号量正常返回,如果被信号打断,返回-EINTR。 int down_trylock(struct semaphore * sem); 该函数试着获得信号量sem,如果能够即时获得,他就获得该信号量并返回0,否则,表示不能获得信号量sem,返回值为非0值。因此,他不会导致调用者睡眠,能在中断上下文使用。 int down_killable(struct semaphore *sem);int down_timeout(struct semaphore *sem, long jiffies);int down_timeout_interruptible(struct semaphore *sem, long jiffies); 释放内核信号量(V) void up(struct semaphore * sem); 该函数释放信号量sem,即把sem的值加1,如果sem的值为非正数,表明有任务等待该信号量,因此唤醒这些等待者。 补充 int down_interruptible(struct semaphore *sem) 这个函数的功能就是获得信号量,如果得不到信号量就睡眠,此时没有信号打断,那么进入睡眠。但是在睡眠过程中可能被信号打断,打断之后返回-EINTR,主要用来进程间的互斥同步。 下面是该函数的注释: /*** down_interruptible - acquire the semaphore unless interrupted* @sem: the semaphore to be acquired** Attempts to acquire the semaphore. If no more tasks are allowed to* acquire the semaphore, calling this function will put the task to sleep.* If the sleep is interrupted by a signal, this function will return -EINTR.* If the semaphore is successfully acquired, this function returns 0.*/ 一个进程在调用down_interruptible()之后,如果sem<0,那么就进入到可中断的睡眠状态并调度其它进程运行, 但是一旦该进程收到信号,那么就会从down_interruptible函数中返回。并标记错误号为:-EINTR。 一个形象的比喻:传入的信号量为1好比天亮,如果当前信号量为0,进程睡眠,直到(信号量为1)天亮才醒,但是可能中途有个闹铃(信号)把你闹醒。 又如:小强下午放学回家,回家了就要开始吃饭嘛,这时就会有两种情况:情况一:饭做好了,可以开始吃;情况二:当他到厨房去的时候发现妈妈还在做, 妈妈就对他说:“你先去睡会,待会做好了叫你。” 小强就答应去睡会,不过又说了一句:“睡的这段时间要是小红来找我玩,你可以叫醒我。” 小强就是down_interruptible,想吃饭就是获取信号量,睡觉对应这里的休眠,而小红来找我玩就是中断休眠。 使用可被中断的信号量版本的意思是,万一出现了semaphore的死锁,还有机会用ctrl+c发出软中断,让等待这个内核驱动返回的用户态进程退出。而不是把整个系统都锁住了。在休眠时,能被中断信号终止,这个进程是可以接受中断信号的! 比如你在命令行中输入# sleep 10000,按下ctrl + c,就给上面的进程发送了进程终止信号。信号发送给用户空间,然后通过系统调用,会把这个信号传给递给驱动。信号只能发送给用户空间,无权直接发送给内核的,那1G的内核空间,我们是无法直接去操作的。 内核信号量的使用例程 场景1 在驱动程序中,当多个线程同时访问相同的资源时(驱动中的全局变量时一种典型的共享资源),可能会引发“竞态“,因此我们必须对共享资源进行并发控制。Linux内核中 解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。 在这里插入图片描述 场景2 有时候我们希望设备只能被一个进程打开,当设备被占用的时候,其他设备必须进入休眠。 信号处理示意图 在这里插入图片描述 如上图: 进程A首先通过open()打开设备文件,调用到内核的hello_open(),并调用down_interruptible(),因为此时信号量没有被占用,所以进程A可以获得信号量; 进程A获得信号量之后继续处理原有任务,此时进程B也要通过open()打开设备文件,同样调用内核函数hello_open(),但此时信号量获取不到,于是进程B被阻塞; 进程A任务执行完毕,关闭设备文件,并通过up()释放信号量,于是进程B被唤醒,并得以继续执行剩下的任务, 进程B执行完任务,释放设备文件,通过up()释放信号量 代码如下: #include  #include  #include  #include  #include  #include  #include  static int major = 250;static int minor = 0;static dev_t devno;static struct cdev cdev;static struct class *cls;static struct device *test_device;static struct semaphore sem;static int hello_open (struct inode *inode, struct file *filep){        if(down_interruptible(&sem))//p    {        return -ERESTARTSYS;    }      return 0;}static int hello_release (struct inode *inode, struct file *filep){    up(&sem);//v    return 0;}static struct file_operations hello_ops ={    .open = hello_open,    .release = hello_release,};static int hello_init(void){    int result;    int error;        printk("hello_init \n");    result = register_chrdev( major, "hello", &hello_ops);    if(result < 0)    {        printk("register_chrdev fail \n");        return result;    }    devno = MKDEV(major,minor);    cls = class_create(THIS_MODULE,"helloclass");    if(IS_ERR(cls))    {        unregister_chrdev(major,"hello");        return result;    }    test_device = device_create(cls,NULL,devno,NULL,"test");    if(IS_ERR(test_device ))    {        class_destroy(cls);        unregister_chrdev(major,"hello");        return result;    }    sem_init(&sem,1);    return 0;}static void hello_exit(void){    printk("hello_exit \n");    device_destroy(cls,devno);        class_destroy(cls);    unregister_chrdev(major,"hello");    return;}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("daniel.peng"); 测试程序 test.c #include  #include  #include  #include  main(){    int fd;        printf("before open\n ");        fd = open("/dev/test",O_RDWR);  //原子变量  0    if(fd<0)    {        perror("open fail \n");        return;    }    printf("open ok ,sleep......\n ");        sleep(20);    printf("wake up from sleep!\n ");            close(fd);   //加为1} 编译步骤 1 make 生成 hello.ko 2 gcc test.c -o a 3 gcc test.c -o b…

摩登3注册开户_一个端口号可以同时被两个进程绑定吗?

一、1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端口号8888 2个进程1个建立TCP server、1个建立UDP server,都使用端口号8888 1. 测试代码 我们首先编写两个简单的测试程序。 tcp.c 该程序仅仅创建tcp套接字并绑定端口号8888,没有accept建立连接操作,并且sleep(1000),让进程不要太快退出。 /*******服务器程序  TCPServer.c ************/#include  #include  #include  #include  #include  #include  #include  #include  #include  #define WAITBUF 10#define RECVBUFSIZE 1024int main(int argc, char *argv[]){ int sockfd,new_fd,nbytes; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int portnumber = 8888; socklen_t sin_size; char hello[512]; char buffer[RECVBUFSIZE]; /*端口号不对,退出*/ /*服务器端开始建立socket描述符*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)   {  fprintf(stderr,"Socket error:%s\n\a",strerror(errno));  exit(1); } /*服务器端填充 sockaddr结构*/  bzero(&server_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; /*自动填充主机IP*/ server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /*捆绑sockfd描述符   进程+端口号+ip+socket*/  if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {  fprintf(stderr,"Bind error:%s\n\a",strerror(errno));  exit(1); } /*监听sockfd描述符*/ if(listen(sockfd, WAITBUF)==-1) {  fprintf(stderr,"Listen error:%s\n\a",strerror(errno));  exit(1); } sleep(1000);//让程序不要这么快的退出 close(sockfd); exit(0);} udp.c 该程序仅仅创建udp套接字并绑定端口号8888,没有accept建立连接操作,并且sleep(1000),让进程不要太快退出. #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #define SERVER_PORT 8888 #define MAX_MSG_SIZE 1024 int main(void) {  int sockfd;  struct sockaddr_in addr;  /* 服务器端开始建立socket描述符 */  sockfd=socket(AF_INET,SOCK_DGRAM,0);  if(sockfd<0)  {   fprintf(stderr,"Socket Error:%s\n",strerror(errno));   exit(1);  }  /* 服务器端填充 sockaddr结构 */  bzero(&addr,sizeof(struct sockaddr_in));  addr.sin_family=AF_INET;  addr.sin_addr.s_addr=htonl(INADDR_ANY);  addr.sin_port=htons(SERVER_PORT);  /* 捆绑sockfd描述符 */  if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)  {   fprintf(stderr,"Bind Error:%s\n",strerror(errno));   exit(1);  }  sleep(1000); close(sockfd); }  编译 gcc tcp.c -o tcpgcc udp.c -o udp 2. 执行结果 1).2个进程分别建立TCP server 情况1执行结果 从结果可知,第二个进程绑定端口号8888绑定失败。 2).2个进程分别建立UDP server 情况2执行结果 从结果可知,第二个进程绑定端口号8888绑定失败。 3).1个建立TCP server、1个建立UDP server 情况3执行结果 用netstat命令查看信息。 netstat 从结果可知,该种情形,两个进程分别绑定成功。 3. 结果分析 由上述结果可知:TCP、UDP可以同时绑定一个端口8888,但是一个端口在同一时刻不可以被TCP或者UDP绑定2次。原因如下: tcp的端口不是物理概念,仅仅是协议栈中的两个字节; TCP和UDP的端口完全没有任何关系,完全有可能又有一种XXP基于IP,也有端口的概念,这是完全可能的; TCP和UDP传输协议监听同一个端口后,接收数据互不影响,不冲突。因为数据接收时时根据五元组**{传输协议,源IP,目的IP,源端口,目的端口}**判断接受者的。 二、端口号的一些其他知识点 1. 端口号的作用 端口号可以用来标识同一个主机上通信的不同应用程序,端口号+IP地址就可以组成一个套接字,用来标识一个进程。 2. 端口号的应用场景 在TCP/IP协议中,用“源IP地址”,“目的IP地址”,“源端口号”,“目的端口号”,协议号(IP协议的协议号为4,TCP的协议号为6)这样的一个五元组来标识一个通信,通信的双方在发送消息时,消息的头部会带着这样的五元组。 3. 端口范围划分 (1)0~1023:知名端口号,是留着备用的,一把都是用于协议,例如HTTP、FTP、SSH ; (2)1024~65535:是操作系统动态分配的端口号,客户端程序的端口号,就是由操作糸统从这个范围来分配的,在TCP与UDP的套接字通信中,客户端的端口号就是在此范围中。 4. 知名的端口号与端口号对应的服务器 比如:  HTTP服务器:80  FTP服务器:21 ps:FTP有一个控制连接和一个数据连接,所以FTP是有两个端口号的,控制连接的端口号是21,数据连接的端口号是20,但是如果FTP的端口号默认是21,如果指明FTP有两个端口号的话,那就是21和20,否则FTP服务器的端口号就是21  TELNET服务器:23  SSH服务器:22  HTTPS:443  WEB服务器:25 5. 在linux中如何查看知名端口号? cat /etc/services 6. 一个进程是否可以bind多个端口号? 可以 因为一个进程可以打开多个文件描述符,而每个文件描述符都对应一个端口号,所以一个进程可以绑定多个端口号。 Linux内核会给每一个socket分配一个唯一的文件描述符,进程通过该文件描述符来区分对应的套接字。 7. 一个端口号是否可以被多个进程绑定? 同种协议通常不可以,但有一种情况可以。 ps:如果进程先绑定一个端口号,然后在fork一个子进程,这样的话就可以是实现多个进程绑定一个端口号,但是两个不同的进程绑定同一个端口号是不可以的。 三、SO_REUSEADDR有什么用处和怎么使用? 当两个socket的address和port相冲突,而我们又想重用地址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只有两者之一有这个特性还是有问题的。 SO_REUSEADDR可以用在以下四种情况下。(摘自《Unix网络编程》卷一,即UNPv1) 当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时【4次握手】,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。 一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。 SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态。 4次握手顺序见下图: 4次握手 SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情况。 SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1。 SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。 SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。 SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。 SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。 SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。 SO_REUSEPORT选项有如下语义:此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行。 如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。 使用这两个套接口选项的建议:在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;当编写一个同一时刻在同一主机上可运行多次的多播应用程序时,设置SO_REUSEADDR选项,并将本组的多播地址作为本地IP地址捆绑。 设置方法如下: if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,   (const void *)&nOptval , sizeof(int)) < 0)    ... 附 Q:编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思? A:这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明”地址已经使用中”。如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR…

摩登3娱乐怎么样?_华为荣耀正式拥有全新的使命和愿景,全面拥抱年轻人

众所周知,荣耀的市场占比虽然高,而盈利方面不及华为高端产品线Mate、P系列,后两者能带来更高的品牌溢价与利润。上个月初,著名苹果分析师、天风证券分析师郭明錤便在报告中称,华为的应变之策中,最有可能发生情境之一为华为出售荣耀手机业务。 11月17日,多家企业在《深圳特区报》发布联合声明,深圳市智信新信息技术有限公司已与华为投资控股有限公司签署了收购协议,完成对荣耀品牌相关业务资产的全面收购。出售后,华为不再持有新荣耀公司的任何股份。 深圳市智信新信息技术有限公司,由深圳市智慧城市科技发展集团与30余家荣耀代理商、经销商共同投资设立,包括天音通信有限公司、苏宁易购集团股份有限公司、北京松联科技有限公司、深圳市顺电实业有限公司、山东怡华通信科技有限公司、深圳冀顺通投资有限公司、河南象之音健康科技有限公司、福建瑞联优信科技有限公司、内蒙古英孚特通讯技术有限公司、哈尔滨金潭科技发展有限公司等。 声明还称,所有权的变化不会影响荣耀发展的方向,荣耀高层及团队将保持稳定。投资新荣耀的经销商和代理商也承诺:未来只享有财务上的投资回报,在业务侧将遵循公平交易的市场化原则,与其他经销商、代理商享受同等机会。 2013年12月16日,华为打造的互联网手机品牌荣耀正式发布,坚持以互联网创新的轻资产模式。当时,荣耀推出荣耀3C、荣耀3X及华为喵王,成为华为终端发展史上的里程碑事件。 2017年,荣耀以5450万台的销量、789亿元销售额,登上中国互联网手机第一的宝座。 2018年12月26日,荣耀五周年庆暨荣耀V20新品发布会正式举行。发布会上,荣耀宣布启动品牌升级:启用新LOGO,新视觉,新Slogan,荣耀拥有全新的使命和愿景,全面拥抱年轻人。 荣耀品牌诞生于2013年,始终面向年轻人,坚持中低端价位,七年间发展成为年出货量超七千万部的互联网手机品牌。对荣耀的消费者、渠道、供应商、合作伙伴及员工的付出、爱护与支持,华为深表感谢! 祝福独立后的荣耀与股东、合作伙伴和员工一道,踏上新荣耀之路,持续为消费者创造价值,创造一个属于年轻人的智慧新世界!

摩登3新闻554258:_还记得那个「最牛删库跑路事件」的程序员吗?他被判了….

大家应该还记得,在今年 2 月份的时候,国内一则程序员删库的消息传遍了全网。 这则消息刷屏的原因很简单——他的几行代码,直接让上市公司微盟的市值一天之内蒸发超 10 亿元,数百万用户受到直接影响。 可以说,这是国内IT界史上最牛逼的删库跑路案例了。 2月25日,“天降横祸”惨被删库的微盟官方宣称,微盟的业务系统数据库(包括主备)遭遇其公司运维人员的删除。 犯罪嫌疑人为微盟研发中心运维部核心运维人员贺某,其在2月23日晚18点56分通过个人VPN登入公司内网跳板机,对微盟线上生产环境进行了恶意破坏。 后来,当事人贺某被警方刑事拘留,而微盟在腾讯云的协作下,花了七天七夜才找回数据。 再加上客户赔付、数据恢复和加班支出,就高达数千万元。 据悉,微盟成立于 2013 年 4 月,是微信生态的第三方服务商,主要提供在线商城系统、商城小程序等等。 根据 2019 年财报数据显示,微盟的注册商户超 300 万。 删库事件发生后,微盟无数商家的生意被迫停摆,不少商家称,“如果客户数据不能找回,对我们的打击是毁灭性的。” 对于贺某做出如此举动的原因,当时网上也有未经证实的消息传出,称贺某是因为桃色事件才删库。 后来经过警方了解,贺某一直深陷网络贷,还曾经有过轻生行为。 并且春节期间贺某一直没有回家,由于疫情不能外出,只能一个人在房间里单独处了 30 多天,加上本身经济上的困难,就做出了这样的举动。 近日,微盟“删库”主角的判决书在网上公开。 判决书显示,8 月 26  日,上海市宝山区人民法院对该案作出一审宣判,贺某被判处 6 年有期徒刑。  向下滑动可查看全文 案件经过摘录如下: 2020 年 2 月 23 日 18 时 56 分许,贺某 酒后因生活不如意、无力偿还网贷 等个人原因,在其暂住地上海市宝山区逸仙路XXX弄XXX号XXX室,通过电脑连接公司 VPN、登录公司服务器后执行删除任务,将微盟服务器内数据全部删除,导致微盟自 2020 年 2 月 23 日 19 时起瘫痪,300 余万用户(其中付费用户 7 万余户)无法正常使用该公司 SaaS 产品,经抢修于 3 月 3 日 9 时恢复运营(故障时间 8 天 14 个小时)。 截至 2020 年 4 月 30 日,造成微盟公司支付恢复数据服务费、商户赔付费及员工加班报酬等 经济损失共计人民币 2260 余万元。 2020 年 2 月 24 日,贺某在暂住地被公安人员抓获,到案后如实供述了上述犯罪事实。 法院判决摘录如下: 上海市宝山区人民法院认为,贺某违反国家规定,删除计算机信息系统中存储的数据, 造成特别严重的后果 ,其行为已构成破坏计算机信息系统罪,应当依法追究刑事责任。公诉机关指控的犯罪事实清楚,证据确实充分,罪名成立。 贺某如实供述自己的罪行,认罪认罚,可依法从轻处罚。辩护人的相关意见本院予以采纳。依照《中华人民共和国刑法》第二百八十六条第二款、第六十七条第三款、第六十四条、《中华人民共和国刑事诉讼法》第十五条之规定,判决如下: 一、贺某犯破坏计算机信息系统罪, 判处有期徒刑六年 。(刑期从判决执行之日起计算。判决执行以前先行羁押的,羁押一日折抵刑期一日,即自 2020 年 2 月 24 日起至 2026 年 2 月 23 日止。) 二、作案工具笔记本电脑一台依法没收。 今年 8 月 ,微盟发布了 2020 年上半年财报。 财报显示,微盟上半年净亏损为 5.46 亿元,其中删库事件预计赔付 0.87 亿元。 当然,受损的不只是微盟,还有微盟的一众用户,这个数字更加难以计量。 这个跟“段子”一样的事件,在国内造成轰动,也给各大企业敲响了警钟。…

摩登3测速代理_C语言最常用的贪心算法就这么被攻克了

来源:大鱼机器人 01 基本概念 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关。) 所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。 02 贪心算法的基本思路 解题的一般步骤是: 1.建立数学模型来描述问题;2.把求解的问题分成若干个子问题;3.对每一子问题求解,得到子问题的局部最优解;4.把子问题的局部最优解合成原来问题的一个解。 03 该算法存在的问题 不能保证求得的最后解是最佳的 不能用来求最大值或最小值的问题 只能求满足某些约束条件的可行解的范围 04 贪心算法适用的问题 贪心策略适用的前提是:局部最优策略能导致产生全局最优解。 实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断。 05 贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。 06 贪心算法的实现框架 从问题的某一初始解出发: while (朝给定总目标前进一步){ 利用可行的决策,求出可行解的一个解元素。} 由所有解元素组合成问题的一个可行解; 07 例题分析 如果大家比较了解动态规划,就会发现它们之间的相似之处。最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。而贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。 话不多说,我们来看几个具体的例子慢慢理解它: 1.活动选择问题 这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。 考虑使用贪心算法的解法。为了方便,我们用不同颜色的线条代表每个活动,线条的长度就是活动所占据的时间段,蓝色的线条表示我们已经选择的活动;红色的线条表示我们没有选择的活动。 如果我们每次都选择开始时间最早的活动,不能得到最优解: 如果我们每次都选择持续时间最短的活动,不能得到最优解: 可以用数学归纳法证明,我们的贪心策略应该是每次选取结束时间最早的活动。直观上也很好理解,按这种方法选择相容活动为未安排活动留下尽可能多的时间。这也是把各项活动按照结束时间单调递增排序的原因。 #include #include #include using namespace std; int N;struct Act{ int start; int end;}act[100010];bool cmp(Act a,Act b) { return a.end }int greedy_activity_selector() { int num=1,i=1; for(int j=2;j<=N;j++) { if(act[j].start>=act[i].end) { i=j; num++; } } return num;}int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%lld %lld",&act[i].start,&act[i].end); } act[0].start=-1; act[0].end=-1; sort(act+1,act+N+1,cmp); int res=greedy_activity_selector(); cout< endl ; }} 2.钱币找零问题 这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。 #include #include using namespace std;const int N=7;int Count[N]={3,0,2,1,0,3,5};int Value[N]={1,2,5,10,20,50,100};int solve(int money){ int num=0;…

摩登3娱乐登录地址_我国高速公路的ETC使用率较大

当今,随着我国ETC普及率的不断上升,我国高速公路的ETC使用率也不断提升。当前,我国高速公路ETC使用率超过了65.98%。 在交通运输部召开的10月例行新闻发布会上,交通运输部新闻发言人、政策研究室主任吴春耕介绍,从5月6日全国高速公路恢复收费以来,目前全国高速公路网运行总体平稳有序,交通量持续增加,路网通行顺畅,系统转换磨合初期出现的各类问题,基本得到有效解决。“据统计,从5月6日到10月26日,全国高速公路日均车流量3196.75万辆,同比增长5.39%。”吴春耕说,这个增幅高于普通国省干线日均断面车流量1.18个百分点。高速公路日均拥堵缓行500米以上的收费站数量和去年同期相比,下降62.29%,高速公路出入口的收费站拥堵缓行的状况得到全面缓解。高速公路省界交通拥堵现象彻底根除,成为历史。 敦煌高速公路处积极采取有效措施,联合辖区合作银行多方面入手,全面助力提升ETC使用率。“走出去+请进来”。全方位开展“绿通”预约宣传工作,由自营网点带队,对辖区货运车辆密集地区进行“摸排扫”。同时,将长期通行固定线路的“绿通”车辆货运司机“请进来”,一对一进行业务解读及政策宣传工作,积极引导客户使用预约通行平台,有效提高ETC使用率。 吴春耕表示,高速公路在国庆中秋8天长假期间,流量大幅度增加,拥堵明显减少。同时又经历了收费到免费到收费的系统切换,总的看运行平稳,反映良好,经受了一次压力测试,这也可以说明,联网后的全国公路收费系统和车站工作进入平稳运行期。“截至10月26日,全国高速公路ETC使用率目前超过65.98%,其中,客车ETC使用率超过70%,货车ETC使用率超过53%。随着ETC的快速普及,全国高速公路通行效率将进一步提升,公路的出行也将更加便捷。”吴春耕说。

摩登3平台首页_为什么银行抢着给车主们装ETC,这到底有没有套路?

当今,随着ETC的普及,人们不难发现很多银行都在抢着给车主们安装ETC。这究竟是为什么呢?到底有没有套路呢? 其实在30年前,谁也没有想过现在家家户户都能买得起轿车了,其实这是一件好事,这意味着人们的收入水平越来越高了,生活质量也越来越好了。小轿车也不再是人们奢望的东西了,要知道,在30年前,汽车可以说是很多人比较想拥有的东西,而且在那个年代,小轿车也是比较稀奇的。 现在我们走在街上不难发现,路上的私家车越来越多。这是因为现在人们的经济水平提高了,而且私家车的价格也在下降,大多数普通家庭都可以承受得起,所以为了出行的方便,大家会选择买一辆属于自己的车。 人们越喜欢开车,就越注意与汽车有关的事情。首先是考驾照,考完后买车,买什么样的车,走什么样的路比较方便等等。很多人在有了驾照、买了车后都喜欢上高速公路上走,因为高速公路上没有红绿灯,道路也更为宽广,这样就节省了很多时间。但是,如果你有驾照还不到一年,你必须找到一个有三年以上驾驶经验的司机陪你上高速公路。然而,上了高速公路的人往往会注意到一个时间,人们上了高速公路,必须要先拿单子,一个一个地通过,所以节假日高速公路也会遭遇拥堵。为了减少此类事故的发生,高速上建立了一个特殊的通道,允许车辆快速通行,这就是ETC。 大家都知道,高速公路是收费的,有些人为了方便,也就装上了ETC装置,为的就是能够在收费的时候节省时间,避免拥堵。然而现在,银行似乎在抢着给人们装ETC,有些还是免费安装,这到底是为什么呢? 国家正在大力推广这一规定,它可以给人们带来方便。同时,银行也是商业机构,仍然需要每年完成一定的业绩,以获得一定的利润。银行之所以大力推进,就是为了建立新的利润增长点,并借此机会扩大银行信用卡发行规模。信用卡对商业银行来说非常重要,可以带来很多的利润,主要包括非利息收入和利息收入。如果你有一个在银行工作的朋友,自己的车还没有装ETC的话,就帮他完成一个指标吧,要不然,他可能会被扣工资。 车主们在装了ETC之后,最好不要设置免密支付,也不能私自拆卸ETC。 一般情况下,ETC所绑定的银行卡,都是默认开通“免密支付”的功能,在这样的情况下,有些不法分子趁着车主不在的时候,拿着类似pos机的刷卡工具,到车子的挡风玻璃面前就能刷走银行卡里面的钱。主要就是在一定限额之内刷卡,可以不需要输入密码。所以说,将这项功能关闭还是比较好的,可以避免自己的损失。 大家都知道,ETC装置都是贴在挡风玻璃上的,如果贸然拆除,那么背面的胶带就会留下痕迹,清理起来非常困难。其次,在ETC装置的背面还有一个凸起的按钮,当ETC粘在玻璃上的时候,正好利用玻璃将这个凸起的按钮压下去,从而开启ETC装置。在这样的情况下,如果拆除了ETC装置,那么也就意味着ETC重启了,那么ETC所绑定的银行卡等信息都会被清除,还需要重新设置,非常麻烦。 特别说明:根据交通运输部相关规定,在网上购买ETC产品时,需要上传真实有效的文件信息。上传伪造文件,一经审核将被添加到网络高速黑名单中,车辆将无法访问高速网络。那么你家的车有安装ETC吗?

摩登三1960_浅析银行抢着给车主装ETC的原因

当今,随着ETC通道数量的不断增多,越来越多的车主纷纷想要办理ETC。当前,各大银行都在抢着给车主们装ETC,这究竟是为什么呢? 现在我们走在街上不难发现,路上的私家车越来越多。这是因为现在人们的经济水平提高了,而且私家车的价格也在下降,大多数普通家庭都可以承受得起,所以为了出行的方便,大家会选择买一辆属于自己的车。 汽车普及以后,人们的活动范围也越来越大。就拿节假日来说,不少家庭都会选择开车出去自驾游。而说到出远门这件事情,就不得不提高速公路。众所周知,每年的劳动节、国庆节、春节这类节假日,高速公路都可以免费通行。对于那些想出去自驾游的车主来说,这无疑是一个非常好的福利。然而,由于出行的人太多,每次节假日上高速的时候,总是要在收费站前排起长长的队伍。而为了解决这种拥堵的情况,也为了避免因为拥堵而产生的交通事故,高速公路的收费站建立了一个特殊的通道,这个通道不同于传统的人工发卡通道,它可以满足车辆快速通行的要求,这就是ETC(电子不停车收费系统)。 ETC的工作原理是当装有车载设备的车辆通过ETC专用通道时,通过设备识别车辆信息,通过云进行支付。从以前绑定的IC卡和银行账户中自动扣除相应的高速收费,也是一种快速发展的电子收费系统,以造福国家和人民。2019年5月,国家出台规定,要求到年底,全省高速公路车辆必须达到90%以上。它还呼吁将移动支付纳入人工支付渠道。早些时候,国家发改委、交通运输部也发布了”实施计划加速的应用公路不停车电子收费服务”,鼓励银行和金融机构与互联网公司密切合作,同意等网络银行账户和支付账户。 在现实生活中,我们会发现一个奇怪的现象,那就是不少银行都在积极推销ETC,争着抢着让那些还没有办理ETC的车主安装ETC。正常来说,ETC方便的是车主本身,所以车主应该主动去找银行或者相关机构办理。如果不办理,就享受不到便捷通行。那么既然如此,银行为什么还抢着让车主安装ETC呢?常言道:“事出反常必有妖”,所以不少车主都认为这背后有什么套路,因此不敢安装。 首先,国家正在大力推广这一规定,它可以给人们带来方便。同时,银行也是商业机构,仍然需要每年完成一定的业绩,以获得一定的利润。银行之所以大力推进,就是为了建立新的利润增长点,并借此机会扩大银行信用卡发行规模。信用卡对商业银行来说非常重要,可以带来很多的利润,主要包括非利息收入和利息收入。如果你有一个在银行工作的朋友,自己的车还没有装ETC的话,就帮他完成一个指标吧,要不然,他可能会被扣工资。 事实上,车主完全没有必要为这个问题所困扰,更没有必要因此不安装ETC。银行之所以抢着让车主办理ETC,主要是为了自己的利益考虑。要知道,ETC收费制度,其实就是一种预缴费模式,或者是信用卡模式。但无论哪种模式,都需要通过银行来支付。所以,你办理了哪家银行的ETC,其实就相当于你在哪家银行存了一笔钱。 随着5G的逐步普及,预计ETC将通过进一步扩展其功能在社会中发挥重要作用。行政管理部门实时分析城市总体情况,可以有效避免交通堵塞,最大限度地利用能源。