小辣子

导航

软件工程2021:第2次作业—— 谈谈鸿蒙操作系统

一、概述鸿蒙操作系统

  • 开发背景:

2019年美国政府禁止美国对华出口,这切断了华为与大多数芯片和软件供应商的接触,华为需要让公司摆脱美国软件的影响,从全球智能手机供应链中独立出来,于是推出了主打物联网时代的“鸿蒙系统”。

  • 需求:

随着科技不断地发展,用户真正需要的是一个简单而快速的操作系统,这个操作系统,可以有完整的生态(譬如,桌面操作系统,可以兼容早期的Windows软件,手机操作系统,可以很好的兼容或者编译后兼容早期的安卓程序)。

华为系统现在面对的是千千万万有不同想法的用户,对手机的体验需求以及对未来网络的需求是华为需要综合考虑的。其次要解决的问题就是摆脱安卓系统的枷锁。

无论是电脑也好,手机也好,某个操作系统,有足够强大的生态系统,又总能快人一步,体验好几个档次,那么这个操作系统自然会普及开来。

  • 开发历史:

2012年9月,华为开始规划自有操作系统“鸿蒙”。华为“2012诺亚方舟实验室”专家座谈会上,任正非提出了要做终端操作系统防范于未然,要在“断了我们粮食的时候,备份系统要能用得上。”

2017年,鸿蒙内核 1.0

2018年,鸿蒙内核 2.0

2019年,鸿蒙OS 1.0

2019年5月24日,国家知识产权局商标局网站显示,华为已申请“华为鸿蒙”商标,申请日期是2018年8月24日,注册公告日期是2019年5月14日,专用权限期是从2019年5月14日到2029年5月13日。

2019年5月17日,由某教授领导的华为操作系统团队开发了自主产权操作系统——鸿蒙。

2019年8月9日,华为正式发布鸿蒙系统(HongmengOS),实行开源。

2020年,鸿蒙OS 2.0

2020年9月10日,华为在HDC开发者大会上如约发布鸿蒙 2.0,并面向应用开发者发布Beta版本。明年鸿蒙将全面支持华为手机。鸿蒙HarmonyOS正式开源,今年年底首先对国内开发者发布针对智能手机的HarmonyOS beta版本。

2021年4月22日,HarmonyOS应用开发在线体验网站上线。5月18日,华为宣布将HiLink与Harmony OS统一为鸿蒙智联,计划在6月2日正式举办鸿蒙产品发布会。

  • 应用场景:

鸿蒙OS将作为华为迎接全场景体验时代到来的产物,发挥其轻量化、小巧、功能强大的优势,率先应用在智能手表、智慧屏、车载设备、智能音箱等智能终端上,着力构建一个跨终端的融合共享生态,重塑安全可靠的运行环境,为消费者打造全场景智慧生活新体验。

  • 发展趋势:

目前,中国已经具备健全的应用生态和庞大的用户基础,未来华为将依托中国、面向全球打造鸿蒙OS生态,通过聚焦新的价值,开放在通信、照相、全场景、AI等方面的核心能力,与各界生态伙伴共同打造出面向消费者体验更佳的应用和服务,为产业注入新活力,共创全场景智慧化新体验与新生态。在超前的技术特性和战略布局下,鸿蒙OS不仅能为消费者带来万物互联的全场景智慧生活的极致体验,也能让设备商在5G+AI+IOT爆发的全场景智慧化时代抢占先机,让开发者以最少投入覆盖最多用户,快速实现全场景业务创新。

二、关于鸿蒙是否套壳的争议

  • 什么是创新及代码复用与创新的关系:

所谓创新,通俗地讲就是,别人没想到的你想到了;别人没发现的你发现了;别人没做成的你做成了。创新,涉及到软件生产的各个环节和领域,从环节上包括售前创新、售中创新和售后创新;从领域上包括理论与方法论创新、管理与制度创新、过程和控制创新、技术与工具创新、文化创新、科技创新以及其它方面的创新。针对软件开发来讲,核心问题就是如何提升软件开发的质量和生产效率。

创新简单来说应是在已有的基础做出改善。所以鸿蒙的套壳争议我们可以从另外一个角度看,在ASOP这个项目里,任何机构和企业都有义务为开源社区贡献代码,也能够使用和下载开源代码,并基于开源项目做二次开发。所以ASOP的代码并不全是谷歌写的,华为也是ASOP的重要贡献者。而智能手机所使用的安卓系统则是由开源的ASOP代码和谷歌自有的GMS(移动服务)组成的,谷歌终止向华为授权的正是私有的GMS服务。因此华为可以说是在自己所持有的资源下进行代码复用的创新,由于ASOP代码在安卓系统有了成功的运用,而鸿蒙OS的开发又有ASOP代码的参与,因此避免不了系统会有安卓的影子。代码复用的初衷是为了提高效率,节约重复开发的时间。更何况是在技术战争的情况下,华为为什么舍弃自己持有的ASOP代码而且花费更多的经历再去重造新代码,这不仅降低了新系统的开发效率,还浪费了现有的人力物力。

华为消费者业务 CEO 余承东表示:随着全场景智慧时代的到来,华为认为需要进一步提升操作系统的跨平台能力,包括支持全场景、跨多设备和平台的能力以及应对低时延、高安全性挑战的能力,因此逐渐形成了鸿蒙 OS 的雏形,可以说鸿蒙OS的出发点和 Android、iOS 都不一样,是一款全新的基于微内核的面向全场景的分布式操作系统,能够同时满足全场景流畅体验、架构级可信安全、跨终端无缝协同以及一次开发多终端部署的要求,鸿蒙应未来而生。

那么创新的目的是什么呢?是为了让某个东西更加完善,为了让用户体验更好,为了让用户体验到新鲜的功能,为了更加方便。由此看来,华为考虑到了创新的本质,这才有了上述的创新成果。

三、代码风格分析

1.好的代码风格1:

public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) {
        if (childOption == null) {
            throw new NullPointerException("childOption");
        }
        if (value == null) {
            synchronized (childOptions) {
                childOptions.remove(childOption);
            }
        } else {
            synchronized (childOptions) {
                childOptions.put(childOption, value);
            }
        }
        return this;
}

代码分析:这个方法使用键值作为锁对象,缩小了同步范围,提升了效率。

 2.好的代码风格2:

public class ReporterConfig
{
private String m_className;
private List m_properties = new ArrayList();

public void addProperty(Property property)  
{  
    m_properties.add(property);  
}  
}

 代码分析:它正好一览无遗,一眼就能看这个是有两个变量和一个方法的类。

3.不好的代码风格1:

public class ReporterConfig
{
/**
* The class name of the reporter listener
*/
private String m_className;

/** 
* The properties of the reporter listener 
*/  
private List<Property> m_properties = new ArrayList<Property>();  

public void addProperty(Property property)  
{  
    m_properties.add(property);  
}  
}

代码分析:相比于2,3的注释简直画蛇添足,隔断了两个实体变量间的联系,我们不得不移动头部和眼球,才能获得相同的理解度。

4.不好的代码风格2:

int CDownloadPlugin::FirstProcessEvent(void* pEvent, void* target)
{
    ***
    std::unique_lock <std::mutex> lck(g_lock);
    {
        ***
    }
        
    repo_empty.notify_all();
    ***
}
 
DWORD WINAPI TestProc(LPVOID lpThreadParameter)
{
    ***
    std::unique_lock <std::mutex> lck(g_lock);
    while (g_queIEvent.empty())
    {
        repo_empty.wait(lck);
        ***
    }
    ***
}

代码分析: 

问题代码:while (g_queIEvent.empty()), 此循环条件指的是线程终止条件(while循环跳出或者第一次没有进去表明此线程结束)

解决方法:①改为while (!this->isInterrupted()) ②改为while (!m_bStop) 要注意其他地方也要对应处理

5.不好的代码风格3:

void CDownloadPlugin::run()
{
    ***
    while (!this->isInterrupted()) {
        m_Semaphore.Wait();
        ***        
        {
            std::lock_guard<std::mutex> lk(m_mutex_filelist);
            ***
        }
    }
}
 
 
void CDownloadPlugin::UnInit()
{
    //停止并等待线程结束
    if (!this->isInterrupted())
    {
        this->interrupt();
    }
 
    CXdThread::join();
}

代码分析:

产生现象:进程停止卡死(因为子线程没有被正常停止,子线程正在等待互斥量释放——>>>变相的死锁问题)

问题代码:

    //停止并等待线程结束

if (!this->isInterrupted())

{

this->interrupt();

}

解决方法: this->interrupt();下一条语句加m_Semaphore.Signal(); 意思是在主线程停止的时候,设置完子线程终止标志,必须要额外通知子线程,否则子线程会死等信号状态。

 

posted on 2021-09-17 18:31  小辣子  阅读(127)  评论(0编辑  收藏  举报