switch 订阅
任天堂Switch(Nintendo Switch),简称NS,是任天堂公司于2017年3月发布的主机,采用家用机、掌机一体化设计。新机不锁区,支持1920*1080电视输出和1280*720掌上输出。港版2017年3月3日发售,台版12月1日发售,中国大陆版2019年12月4日由腾讯发售 [1-2]  。Nintendo Switch是任天堂前社长岩田聪最后一部参与开发的硬件产品。NS首秀获得强烈反响,预告片YouTube首日播放量超一千万回,一度登顶YouTube播放榜首,风头压过美国大选。 [3]  公开的NS游戏中,已超过160款游戏宣布支持中文。 [4]  Nintendo Switch于2019年1月29日起支持中文系统语言,包括简体中文与繁体中文 [5-6]  。《时代》评2017十大数码产品NS力压iPhone X登顶 [7]  。NS自2017年3月上市以来,仅用9个月就卖出超过1400万台,超过WiiU 1350万台的累积总销量。 [8]  截止2020年3月31日Switch主机销量5577万台,软件销量3.5亿份。 [9]  2019年7月24日,腾讯正式代理引进Nintendo Switch。 [10-11] 展开全文
任天堂Switch(Nintendo Switch),简称NS,是任天堂公司于2017年3月发布的主机,采用家用机、掌机一体化设计。新机不锁区,支持1920*1080电视输出和1280*720掌上输出。港版2017年3月3日发售,台版12月1日发售,中国大陆版2019年12月4日由腾讯发售 [1-2]  。Nintendo Switch是任天堂前社长岩田聪最后一部参与开发的硬件产品。NS首秀获得强烈反响,预告片YouTube首日播放量超一千万回,一度登顶YouTube播放榜首,风头压过美国大选。 [3]  公开的NS游戏中,已超过160款游戏宣布支持中文。 [4]  Nintendo Switch于2019年1月29日起支持中文系统语言,包括简体中文与繁体中文 [5-6]  。《时代》评2017十大数码产品NS力压iPhone X登顶 [7]  。NS自2017年3月上市以来,仅用9个月就卖出超过1400万台,超过WiiU 1350万台的累积总销量。 [8]  截止2020年3月31日Switch主机销量5577万台,软件销量3.5亿份。 [9]  2019年7月24日,腾讯正式代理引进Nintendo Switch。 [10-11]
信息
开发代号
任天堂NX [12]
外文名
Nintendo Switch,NS [12]
主持开发
前社长岩田聪 [13]
主机特色
家用机、掌机一体化 [14]
主机销量
截止2020年3月31日Switch主机销量5577万台,软件销量3.5亿份 [9]
发行商
任天堂 [12]
中文名
任天堂Switch [12]
首发时间
2017年3月3日 港美日欧版 [15]
台韩上市时间
2017年12月1日 台版 韩版 [16]
主机售价
29980日元/299美元/2340港币 [17]
Nintendo Switch历史沿革
2013年,前社长岩田聪、竹田玄洋(技术主管)和宫本茂(创意主管) [14]  制定了一套复兴任天堂商业的计 划。 [14]  由于智能手机普及等因素导致竞争环境发生巨变,任天堂将调整开发体制 [18]  任天堂在2013年2月16日成立“统和开发总部”,以整合原家用游戏机开发部门的约130名员工和便携式游戏机开发部门的约150名员工。 [18]  此外,还将引入将家用游戏机和便携式游戏机连接起来进行游戏的机制。 [18]  自2004年确立的开发体制以来,这是该公司时隔9年再次进行大规模的部门调整。 [18]  2015年03月17日,任天堂宣布将会推出代号NX的游戏专用机,详细计划2016年正式公布。 [19]  2016年,《宝可梦GO [20]  》的爆发、里约奥运会闭幕式的“东京八分钟”乃至马里奥跑酷苹果的商品发布会上的率先登台……任天堂在三个月时间里成功吸引到了足够多的眼球,越来越多的人们开始关注起NS。 [21]  2016年10月20日,该社发表了次世代主机“NINTENDO Switch(简称NS)”。 [22]  醒目的LOGO标记和Joy-Con 手柄组装时的咔嗒、咔嗒声, [22]  效果足以超越任天堂硬件广告史上最为人称道的GBA-SP和Wii两次处女秀。 [22]  10月20日正值美国总统大选电视辩论,NS在各大社交网站话题度压倒特朗普名列首位。 [22]  2016/12/8, [23]  在吉米·法伦主持的今夜秀电视节目里,吉米和美国任天堂总裁为玩家展示了《塞尔达传说:荒野之息》在NS上的实机操作。 [23]  2017年1月13日-15日间召开Nintendo Switch发布会。 [24]  任天堂社长君岛达己, [25]  宣布 Nintendo Switch 在日本、美国、加拿大、欧洲各国、澳洲及中国香港的发售日为 3 月 3 日,售价 299美元、29980 日元 和 2340 港币 [25]  。机器不锁区。 [25]  NintendoSwitch在全球正式发售,随即在各地出现了售罄状况。 [26]  NintendoSwitch主机前2日销量突破了任天 堂史上最成功主机Wii在美国创造的销售纪录。 [26]  发售首周, [27]  NS在北美卖出50万台,在日本卖出36万台,在法国卖出11万台,在英国卖出8.5万台。 [27]  NS首周销量已达150万台。 [27]  这只是上市大约一周多的零售业绩,理论上任天堂制定的本月内全球渠道出货200万的目标已完成。 [28]  有多达89%的NS买家选购了首发护航的《塞尔达传说:荒野之息》,游戏一周销售额已高达1.34亿美元。 [28]  NS发售两月全球累计销量约360万台, [29]  NS发售时期恰好处在传统的销售淡季,和WiiU首发于圣诞商战期完全不存在可比性,其首月274万台的销售量要大大超出任天堂自身原先的预测。 [29]  超乎预想的热销造成了全球性缺货现象,日本本土的小卖业者不得不通过摇号方式来分配极其有限的货源,欧美最大的游戏连锁销售集团GAMESTOP的发言人宣称NS主机在整个2017年内会被缺货所困扰。 [29]  《时代》周刊评选2017年度十大产品,任天堂Switch、苹果iPhone X及微软Surface Laptop位居前三甲。 [7]  截止2017年7月22日,任天堂游戏主机“NS”在全世界销量已超500万台。从销售区域上看,欧洲1,398,764台(27%) 、日本1,200,307台(23%)、美国1,740,629 台(34%),德国销量303,712台,法国348,925台。 [30]  NS全球销量在17年12月10日超过了1000万台。这款发售于2017年3月3日的主机,仅用9个月就达成上千万销量。 [31]  截止2020年3月31日Nintendo Switch主机销量为5577万台,比上季度增长了 329 万台,全财年销量约为 2103 万,同比上财年提高了 24%;NS 软件销量 3.5 亿份,比上季度增长了约 4200 万份,全财年软件销量约为 1.68 亿,同比增长 42.3%。 [9] 
收起全文
精华内容
下载资源
问答
  • 2021-05-19 07:53:58

    C++中如何对字符串进行switch判断?

    C++的开关语句,形式为

    switch(expr1)

    {

    case no1:

    break;

    case no2:

    break;

    ...

    case noN:

    break;

    default:

    break;

    }

    其功能是对expr1的值做判断,并执行与其相等的case分支,并一直执行到break或switch语句结束。

    这里,no1, no2... noN必须是整型常量,而expr1也必须是一个类型为整型的表达式。

    所以,直接对string类型做switch判断是非法的。但是可以根据实际情况,将运算结果转换为整型,从而使用switch语句。

    举例来说,如果已知string类型的对象s,长度为5,其内容为"testN"形式,其中N可能为任意字符。这时要对该对象判断,就可以采用switch语句了。

    switch(s[4])

    {

    case '0':

    break;

    case 'A':

    break;

    ...

    }c语言中switch怎么可以用字符串作条件表达式?

    首先: switch 语句及case 的类型 表达式必须是整数、字符或枚举量值。

    超级好奇地编译了一下:

    1>e:\project\stl_proc\stl_proc\stl_proc\stl_proc.cpp(86) : error C2052: “double”: 非法的 case 表达式类型

    真是颠覆了我的三观。。。。 switch('0.4') 竟然没报错。。 我把下面的修复了之后, 让我们看看程序怎么处理

    改成:

    switch('0.4')

    {

    case '0': a=0;break;

    case'.': a=9;break;

    default:a=7;

    }printf("%d",a);

    运行了一下, 都走到default 分支了 。

    改成:

    switch('0')

    {

    case '0': a=0;break;

    case'.': a=9;break;

    default:a=7;

    }printf("%d",a);

    全部走到 case 0 分支了。

    结论: switch 后面可以不是一个变量。C语言的switch case 语句的case 常量 能匹配字符串常量吗?

    C语言的switch case 语句的case不能匹配字符串常量,只能匹配整型类常量,如int short long char.

    switch用法格式:

    switch ( 表达式)

    {

    case 常量表达式1:

    语句1;

    [break;] 中括号,表示此语句可以没有

    case 常量表达式2:

    语句2;

    [break;]

    ……

    case 常量表达式n:

    语句n;

    [break;]

    [default:]

    语句n+1;

    [break;]

    }

    说明:

    break 表示退出{ }

    case后面只能跟一个值(加冒号:),而不能是一个表达式

    switch(表达式) 后面没有分号(;)

    {}前后没有分号(;)

    default语句可以出现在任何位置,但建议写到最后,表示除去case匹配之外的其它情况。也可以没有default语句c语言中case后可以跟字符么,如case +:printf("...")

    case后可以跟字符,但必须是常量字符,常量字符就是用单引号引起来的字符,如:'a' , '+','.'等

    char ch;

    ch=getchar();

    switch( ch )

    {

    case ’+‘:printf("...")c语言中如何判断两个字符串相等

    可以使用库函数strcmp比较。

    strcmp是C语言比较字符串的库函数。形式为

    int strcmp(char *a, char *b);

    该函数会对a和b的每个字符,按照ascii码值比较,如果二者完全相同返回0;如果a的ascii码值先出现较大者,会返回1;否则返回-1.

    所以,要判断字符串相等,可以使用

    if(strcmp(string1, string2) == 0)

    如果返回为0,则相等,否则不等。C语言中判断两个字符串是否相同的方法

    C语言提供了几个标准库函数,可以比较两个字符串是否相同。以下是用strcmp()函数比较字符串的一个例子:

    #include

    #include

    void main (void);

    void main(void)

    {

    char* str_1 = "abc" ; char * str_2 = "abc" ; char* str_3 = "ABC" ;

    if (strcmp(str_1, str_2) == 0)

    printf("str_1 is equal to str_2. \n");

    else

    printf("str_1 is not equal to str_2. \n");

    if (strcmp(str_1, str_3) == 0)

    printf("str_1 is equal to str_3.\n");

    else

    printf("str_1 is not equalto str_3.\n");

    }

    上例的打印输出如下所示:

    str_1 is equal to str_2.

    str_1 is not equal to str_3.

    strcmp()函数有两个参数,即要比较的两个字符串。strcmp()函数对两个字符串进行大小写敏感的(case-sensitiVe)和字典式的(lexicographic)比较,并返回下列值之一:

    ----------------------------------------------------

    返 回 值 意 义

    ----------------------------------------------------

    <0 第一个字符串小于第二个字符串

    0 两个字符串相等 ·

    >0 第一个字符串大于第二个字符串

    ----------------------------------------------------

    在上例中,当比较str_1(即“abc”)和str_2(即“abc”)时,strcmp()函数的返回值为0。然而,当比较str_1(即"abc")和str_3(即"ABC")时,strcmp()函数返回一个大于0的值,因为按ASCII顺序字符串“ABC”小于“abc”。

    strcmp()函数有许多变体,它们的基本功能是相同的,都是比较两个字符串,但其它地方稍有差别。下表列出了C语言提供的与strcmp()函数类似的一些函数:

    -----------------------------------------------------------------

    函 数 名 作 用

    -----------------------------------------------------------------

    strcmp() 对两个字符串进行大小写敏感的比较

    strcmpi() 对两个字符串进行大小写不敏感的比较

    stricmp() 同strcmpi()

    strncmp() 对两个字符串的一部分进行大小写敏感的比较

    strnicmp() 对两个字符串的一部分进行大小写不敏感的比较

    -----------------------------------------------------------------

    在前面的例子中,如果用strcmpi()函数代替strcmp()函数,则程序将认为字符串“ABC”等于“abc”。C语言的switch语句中的条件都可以是什么类型?

    Switch用在编程中,如C语言中它经常跟Case一起使用,是一个判断选择代码。其功能就是控制业务流程流转的。

    switch语句,即“切换”语句;case即“情况”。

    switch语句的语法如下(switch,case和default是关键字):

    switch ( controllingExpression )

    {case constantExpression1 :

    case constantExpression2 :

    case constantExpression3 :

    statements; /*当满足constantExpression1、constantExpression2、constantExpression3任何一个都执行statements */

    break;

    case constantExpression :

    statements ;

    break;

    ...

    default :

    statements ;

    break;}

    遵守switch语句规则

    switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:

    只能针对基本数据类型使用switch,这些类型包括int、char、枚举、bool等。对于其他类型,则必须使用if语句。

    switch()的参数类型不能为实型 。

    case标签必须是常量表达式(constantExpression),如42或者"42"。

    case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值。

    C语言switch应用例子:

    例一:

    #include

    int main()

    {

    double score;

    printf("请输入分数:\n");

    scanf("%lf",&score);

    switch((int)(score/10))//switch((int)score/10)出现严重错误

    {

    case 10:

    case 9:printf("A(最好)\n");break;

    case 8:printf("B(优秀)\n");break;

    case 7:printf("C(良好)\n");break;

    case 6:printf("D(及格)\n");break;

    case 5:

    case 4:

    case 3:

    case 2:

    case 1:

    case 0:

    printf("E(不及格)\n");break;

    default:

    printf("Error!\n");

    }

    }switch case 语句问题 表达式可以使字符串吗

    不行,可以是整形,包括bit,int,long。在C++里的话用字符也可以,比如case 'c',因为字符在内存里是用一个整数来表示的,也就是传说中的ASC码c语言中switch怎么可以用字符串作条件表达式

    直接使用if..else..语句判断C语言如何比较两个【字符】或者【字符串】是否相等?迷糊了,求解答

    比较字符可以直接使用==比较操作符,如:

    char c1='a',c2='b';

    if(c1==c2) printf("%c is same as %c.",c1,c2);

    else printf("%c is different to %c",c1,c2);

    若是字符串,则需要使用字符串函数了,strcmp

    char s1[]="abc",s2[]="xyz";

    if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);

    C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 标签:break case switch

    更多相关内容
  • switch电脑驱动.rar

    2021-04-28 11:54:44
    switch电脑驱动.rar
  • switch注入工具

    2018-12-07 22:05:42
    switch注入工具Switch破解包,用于SWITCH破解,大气层破解,需要的可以下下
  • SwitchHosts

    2017-09-04 07:46:41
    修改本地的hosts文件,自定义劫持对象,喜欢的话就下载吧。修改本地的hosts文件,自定义劫持对象,喜欢的话就下载吧。
  • SwitchHosts for window 64位

    2018-05-24 01:24:45
    SwitchHosts! 是一个管理、切换多个 hosts 方案的工具。它是一个免费软件。
  • Switchhosts for mac os

    2017-03-22 21:21:56
    Switchhosts for mac os,这hosts绑定工具,解压后就可以用,亲自试过。
  • WXCustomSwitch 微信小程序自定义 Switch 组件模板,微信小程序模板导入即可使用
  • 技术大佬:我去,你写的 switch 语句也太老土了吧

    万次阅读 多人点赞 2020-03-01 09:02:53
    但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer...

    昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!”

    来看看小王写的代码吧,看完不要骂我装逼啊。

    private static String createPlayer(PlayerTypes playerType) {
        switch (playerType) {
            case TENNIS:
                return "网球运动员费德勒";
            case FOOTBALL:
                return "足球运动员C罗";
            case BASKETBALL:
                return "篮球运动员詹姆斯";
            case UNKNOWN:
                throw new IllegalArgumentException("未知");
            default:
                throw new IllegalArgumentException(
                        "运动员类型: " + playerType);
    
        }
    }
    

    看完上述代码后,你是不是会发出这样的感慨——“代码写得很好,没有任何问题啊!”是不是觉得我在无事生非,错怪了小王!但此时我要送上《了不起的盖茨比》中的一句话:

    我年纪还轻,阅历不深的时候,我父亲教导过我一句话,我至今还念念不忘。 “每逢你想要批评任何人的时候, ”他对我说,“你就记住,这个世界上所有的人,并不是个个都有过你拥有的那些优越条件。”

    哈哈,这句话不光是让你看的,也是给我看的。是时候冷静下来谈谈上述 switch 语句的老土问题了。

    看到上图了吧,当不小心删掉 default 语句后,编译器就会报错,提示:“没有返回语句”,为了解决这个问题,我们可以新建一个 player 变量作为返回结果,就像下面这样:

    private static String createPlayer(PlayerTypes playerType) {
        String player = null;
        switch (playerType) {
            case TENNIS:
                player = "网球运动员费德勒";
                break;
            case FOOTBALL:
                player = "足球运动员C罗";
                break;
            case BASKETBALL:
                player = "篮球运动员詹姆斯";
                break;
            case UNKNOWN:
                throw new IllegalArgumentException("未知");
        }
    
        return player;
    }
    

    当添加了 player 变量后,case 语句中就需要添加上 break 关键字;另外在 switch 语句结束后,返回 player。这时候,编译器并不会提示任何错误,说明 default 语句在这种情况下是可以省略的。

    从 JDK 12 开始(本例使用的是 JDK 13),switch 语句升级了,不仅可以像传统的 switch 语句那样作为条件的判断,还可以直接作为一个返回结果。来对小王的代码进行改造,如下所示:

    private static String createPlayer(PlayerTypes playerType) {
       return switch (playerType) {
            case TENNIS -> "网球运动员费德勒";
            case FOOTBALL -> "足球运动员C罗";
            case BASKETBALL -> "篮球运动员詹姆斯";
            case UNKNOWN ->  throw new IllegalArgumentException("未知");
        };
    }
    

    够 fashion 吧?不仅 switch 关键字之前加了 return 关键字,case 中还见到了 Lambda 表达式的影子,中划线和箭头替代了冒号,意味着箭头右侧的代码只管执行无须 break。

    并且,default 语句变成了可选项,可有可无,不信?你也动手试试。

    新的 switch 语句足够的智能化,除了有上述的 3 个优势,还可以对枚举类型的条件进行校验。假如在 PlayerTypes 中增加了新的类型 PINGPANG(乒乓球):

    public enum PlayerTypes {
        TENNIS,
        FOOTBALL,
        BASKETBALL,
        PINGPANG,
        UNKNOWN
    }
    

    此时编译器会发出以下警告:

    意思就是 switch 中的 case 条件没有完全覆盖枚举中可能存在的值。好吧,那就把 PINGPANG 的条件加上吧。来看一下完整的代码:

    public class OldSwitchDemo {
        public enum PlayerTypes {
            TENNIS,
            FOOTBALL,
            BASKETBALL,
            PINGPANG,
            UNKNOWN
        }
    
        public static void main(String[] args) {
            System.out.println(createPlayer(PlayerTypes.BASKETBALL));
        }
    
        private static String createPlayer(PlayerTypes playerType) {
            return switch (playerType) {
                case TENNIS -> "网球运动员费德勒";
                case FOOTBALL -> "足球运动员C罗";
                case BASKETBALL -> "篮球运动员詹姆斯";
                case PINGPANG -> "乒乓球运动员马龙";
                case UNKNOWN -> throw new IllegalArgumentException("未知");
            };
        }
    }
    

    switch 语句变成了强大的 switch 表达式,美滋滋啊!那假如一个运动员既会打篮球又会打乒乓球呢?

    private static String createPlayer(PlayerTypes playerType) {
        return switch (playerType) {
            case TENNIS -> "网球运动员费德勒";
            case FOOTBALL -> "足球运动员C罗";
            case BASKETBALL,PINGPANG -> "牛逼运动员沉默王二";
            case UNKNOWN -> throw new IllegalArgumentException("未知");
        };
    }
    

    就像上述代码那样,使用英文逗号“,”把条件分割开就行了,666 啊!

    不服气?switch 表达式还有更厉害的,-> 右侧还可以是 {} 括起来的代码块,就像 Lambda 表达式那样。

    private static String createPlayer(PlayerTypes playerType) {
        return switch (playerType) {
            case TENNIS -> {
                System.out.println("网球");
                yield "网球运动员费德勒";
            }
            case FOOTBALL -> {
                System.out.println("足球");
                yield "足球运动员C罗";
            }
            case BASKETBALL -> {
                System.out.println("篮球");
                yield "篮球运动员詹姆斯";
            }
            case PINGPANG -> {
                System.out.println("乒乓球");
                yield "乒乓球运动员马龙";
            }
            case UNKNOWN -> throw new IllegalArgumentException("未知");
        };
    }
    

    细心的同学会发现一个之前素未谋面的关键字 yield,它和传统的 return、break 有什么区别呢?

    先来看官方的解释:

    A yield statement transfers control by causing an enclosing switch expression to produce a specified value.

    意思就是说 yield 语句通过使一个封闭的 switch 表达式产生一个指定值来转移控制权。为了进一步地了解 yield 关键字,我们可以反编译一下字节码:

    private static String createPlayer(NewSwitchDemo3.PlayerTypes playerType) {
        String var10000;
        switch(playerType) {
            case TENNIS:
                System.out.println("网球");
                var10000 = "网球运动员费德勒";
                break;
            case FOOTBALL:
                System.out.println("足球");
                var10000 = "足球运动员C罗";
                break;
            case BASKETBALL:
                System.out.println("篮球");
                var10000 = "篮球运动员詹姆斯";
                break;
            case PINGPANG:
                System.out.println("乒乓球");
                var10000 = "乒乓球运动员马龙";
                break;
            case UNKNOWN:
                throw new IllegalArgumentException("未知");
            default:
                throw new IncompatibleClassChangeError();
        }
    
        return var10000;
    }
    

    编译器在生成字节码的时候对 yield 关键字做了自动化转义,转成了传统的 break 语句。这下清楚了吧?

    但是,话又说出来,那些看似 fashion 的代码也不过是把部分秀技的工作交给了编译器,还可能存在对旧版本不兼容、对队友不友好的问题——代码土点就土点呗,没准是最实用的。

    “不好意思,我为昨天早上的嚣张向你道歉。。。。。。”我向小王发送了一条信息。

    好了,我亲爱的读者朋友,以上就是本文的全部内容了,希望能够博得你的欢心。

    最后,一定会有不少读者想要问我怎么学习 Java 的,那我干脆就把我看过的优质书籍贡献出来:

    1)入门版:《Head First Java》、《Java 核心技术卷》

    2)进阶版:《Java编程思想》、《Effective Java》、《Java网络编程》、《代码整洁之道》

    3)大牛版:《Java并发编程》、《深入理解Java虚拟机》、《Java性能权威指南》、《重构》、《算法》

    就先介绍这么多,希望对那些不知道看什么书的同学有所帮助。

    对了,我介绍的这些书籍,已经顺便帮你整理好了,你可以在我的原创微信公众号『沉默王二』回复『书籍』获取哦

    有收获?希望老铁们来个三连击,给更多的同学看到这篇文章

    展开全文
  • SwitchHosts免安装包

    热门讨论 2017-04-24 05:33:46
    SwitchHosts用于快速修改window的hosts文件
  • switchHost

    2015-07-16 20:42:02
    SwitchHosts_v0.2.2.1785 通过host定向访问某机器,该工具可以很方便得切换不同的host
  • PCIe Switch高级功能及应用

    千次阅读 2020-07-16 17:53:39
    PCI-E Switch芯片,估计不少人已经听说过这个东西了。但是估计多数人对其基本功能知之甚少。PCI-E Switch作为最先进的生产力,已经被广泛应用在了传统存储系统,以及少量品牌/型号的服务器平台。 笔者作为拥有全球最...

    PCI-E Switch芯片,估计不少人已经听说过这个东西了。但是估计多数人对其基本功能知之甚少。PCI-E Switch作为最先进的生产力,已经被广泛应用在了传统存储系统,以及少量品牌/型号的服务器平台。 笔者作为拥有全球最领先PCI-E Switch产品的PMC-Sierra公司的系统架构师,想在这里为大家普及一下PCI-E Switch的基本知识。 背景介绍PCI-E大家都了解,主板上有PCI-E槽,里面的金手指就是一堆信号线,其直接被连接到了CPU内部的PCI-E控制器上。然而,当前的Intel平台CPU每颗最大支持40个通道(Lane),一般来讲万兆网卡使用8个通道即可,高端显卡需要x16通道因为在3D运算时需要的吞吐量巨大(笔者的PC使用了老主板来配了块GTX980显卡,只能运行在x8模式上,但是3D性能基本没什么变化,证明x8基本已经足够)。一般的存储卡也使用x8,但是后端12Gb/s SAS存储卡(HBA卡、Raid卡)普遍过渡到了x16。 但是,对于一些高端产品来讲,尤其是那些传统存储系统,每颗CPU提供x40个通道就显得不够用了。传统存储系统的一个特殊要求就是后端和前端HBA数量比较大,所以CPU自带的通道数量无法满足。另外,传统存储控制器之间需要做各种数据交换和同步,一般也是用PCI-E,这又增加了对通道数量的消耗。 对于一般的高端服务器,普遍都是双路、四路配置,双路下提供x80通道,理论上可连接10个x8的PCI-E设备,去掉一些用于管理、内部嵌入式PCI-E设备的通道占用之后,连接8个设备不在话下,可以覆盖几乎所有应用场景。 但是, 随着用户对融合、统一、效率、空间、能耗要求的不断提升,近年来出现了不少高密度模块化服务器平台,或者说,开放式刀片。这类服务器平台对PCI-E方面产生了一些特殊需求,比如Partition和MR-IOV。下面,笔者就详细展开介绍这些知识。 基本功能1.FanoutFanout(扩展、扩开、散开的意思)是PCI-E switch的基本功能,或者说,PCI-E标准体系一开始就是应对通道数量不够用才设计了PCI-E Switch这个角色。

    在PCI-E之前的一代标准是PCI-X,那时候并没有Switch的概念,Fanout采用的是桥接的形式,形成一个树形结构,如上图中间所示。 Switch的概念是在PCI-E时代引入的,其相对于桥最大的一个本质区别就是同一个Bus内部的多个角色之间采用的是Switch交换而不是Bus。PCI-X时代真的是使用共享Bus传递数据,这就意味着仲裁,意味着低效率。然而,PCI-E保留了PCI-X体系的基本概念,比如依然沿用“Bus”这个词,以及“桥/Bridge”这个词,但是这两个角色都成为了虚拟角色。一个Switch相当于一个虚拟桥+虚拟Bus的集合体,每个虚拟桥(VB)之下只能连接一个端点设备(也就是最终设备/卡,End Point/EP)或者级联另外一个Switch,而不能连接到一个Bus,因为物理Bus已经没了。这种Fanout形式依然必须遵循树形结构,因为树形结构最简单,没有环路,不需要考虑复杂路由。 2.Partition分区功能相当于以太网Switch里的Vlan,相当于SAS Switch/Expander里的Zone。

    如上图所示,两台或者多台机器,可以连接到同一片PCI-E Switch,在Switch做分区配置,将某些EP设备分配给某个服务器。这样可以做到统一管理,灵活分配。每台服务器的BIOS或者OS在枚举PCI-E总线时只会发现分配给它的虚拟桥、虚拟BUS、和EP。多个分区之间互不干扰。 多台独立服务器连接到同一片Switch上,如果不做Partition,是会出现问题的,因为两个OS会分别枚举同一堆PCI-E总线内的角色,并为其分配访问地址,此时会出现冲突。 3.NTB有些特殊场景下,比如传统存储系统中的多个控制器,它们之间需要同步很多数据和控制信息,希望使用PCI-E链路直接通信。问题是,图中的两台服务器并不可以直接通信,因为必须身处两个不同的分区中。为了满足这个需求,出现了NTB技术。其基本原理是地址翻译,因为两个不同的系统(术语System Image,SI)各有各的地址空间,是重叠的。那么只要 在PCI-E Switch内部将对应的数据包进行地址映射翻译,便可以实现双方通信。这种带有地址翻译的桥接技术叫做None Transparent Bridge,非透明桥。

    基本功能1.Dynamic Partition上文中的分区配置必须是静态配置,必须在BIOS启动之前,也就是CPU加电之前,对PCI-E Switch进行分区配置,可以使用BMC做配置。分区配置好之后,在系统运行期间,不能够动态改变。这就意味着,某个PCI-E卡如果被分配到了服务器A,则其不能在不影响服务器A和B的运行前提下,被动态重新分配到服务器B。 PMC-Sierra公司Switchtec旗下的PCI-E Switch产品则支持动态分配。具体的实现手段笔者就不能透露了。不过,对于内行开发者来讲,这些都不是问题,问题是对应的芯片内部的架构是否足够灵活可配置,这是限制高级功能设计的关键。 2.Fabric上文中说过,不管是PCI-X还是PCI-E体系标准内,只支持树形拓扑。树形拓扑的问题在于,路径过长,整个网络的直径太大。另外,无法实现冗余,一旦某个链路故障,链路后方的分支全部无法访问。 于是, 支持Fabric成了一个非常复杂的高级功能。这个场景目前还很少有人使用,对于整机架服务器比如天蝎等,其对这项功能兴趣则比较大。然而,目前这个技术的实现还非常初级不完善,也没有形成标准。

    3.IOVSR-IOV,不少人都听说过,但却不知道里面具体的门道,Single Root IO Virtualization里的Root是什么意思?Single Root又何解?还有Multi Root IOV,这又是什么鬼? SR-IOV,是指把插在一台服务器上的一块PCI-E卡虚拟成多块虚拟卡,给运行在这台服务器上的多个虚拟机用,每个虚拟机都识别到一个PCI-E卡,但是VM并不知道这个卡是虚拟出来的。如果不虚拟成多块卡,多个VM怎么共享这个设备?答,必须通过Hypervisor提供的服务来使用该设备。Hypervisor会在VM内安装一个驱动程序,这个驱动会虚拟一个并不存在的设备,比如 “XXX牌以太网卡”,这个驱动会真的与OS协议栈挂接上,从而接收上层下发的数据包。但是这个驱动收到数据包之后,由于根本不存在实际的网卡,这个驱动其实是将这个包发送给了Hypervisor,或者有些虚拟机实现是使用一个domain 0特权VM来负责与真实硬件打交道,那么这个驱动会将数据发送给这个特权VM,Guest VM与特权VM之间通过进程间通信来传递数据,Hypervisor或者特权VM收到数据之后,再通过真实的驱动,比如“Intel xxx Ethernet card”将数据包发送给真实网卡。 这么一转发,就慢了,因为内存拷贝的代价比较高,吞吐量要求如果很大的话,这种方式就不行了。于是,SR-IOV出马解决了这个问题。SR-IOV需要直接在PCI-E卡的硬件里虚拟出多个子设备。如何做到? 首先,支持SR-IOV的PCI-E卡,需要向系统申请成倍的地址空间,想虚拟出几个设备,就需要按照SR-IOV的规范格式来声明相比原先几倍的地址空间。这个地址空间会在内核或者BIOS枚举PCI-E设备的时候被获取到,系统会将为该设备申请的地址空间段的基地址写入设备寄存器。比如某网卡虚拟出8个虚拟网卡来,然后由内核PCI-E管理模块向系统申报8个PCI-E设备。随后就是由Hypervisor将对应的设备映射给对应的VM,VM中加载对应的Host Driver。Hypervisor还需要执行地址翻译,或者硬件辅助的地址翻译。 只要PCI-E设备自身支持SR-IOV,PCI-E Switch不需要做任何额外处理即可原生支持。但是 MR-IOV则必须在PCI-E switch上做额外处理才可以支持。原因还是因为多个独立系统之间是互不沟通的,如果都尝试对PCI-E总线进行配置会冲突。PCI-E Switch针对MR-IOV的支持基本手段,还是靠增加一层地址映射管理来实现。 Dell PowerEdge FX2平台对PCI-E Switch的应用Dell PowerEdge FX2是一款2U多节点服务器平台框架,其采用一个2U的Chassis机箱,最大可以容纳: 2个1U Server Sled或者1个1U Server Sled+2个1U半宽存储Sled或者1个1U半宽Server Sled+3个1U半宽存储Sled或者4个1U半宽Server Sled或者2个1U半宽Server Sled+2个1U半宽存储Sled或者3个1U半宽Server Sled+1个1U半宽存储Sled或者8个1U四分之一宽Server Sled 多种灵活组合都可实现。如下图所示。

    机箱背面有8个PCI-E槽位。

    这8个PCI-E槽位可以被灵活的分配给机箱正面的各种组合的Server Sled。这就得益于PCI-E Switch以及Partition功能的使用。笔者画了一张示意图来向大家介绍一下其内部的导向路径。如下图所示,1/2号槽位所连接的端口与服务器Sled1所连接的端口处于红色分区之内,3/4槽位与服务器Sled2处于黄色分区。而5/6/7/8槽位、存储Sled、服务器Seld3则同处于蓝色分区内。意味着,服务器Sled3会识别到5/6/7/8槽位上的PCI-E卡(如有),同时识别到存储Sled上的RAID卡。

    基于Web的配置界面,通过连接到BMC,可以对整个FX2平台所囊括的所有Sled进行全局配置,包括分配对应的PCI-E槽位,也就是底层的对PCI-E Switch的分区操作。

    通过对PCI-E Switch分区功能的灵活运用,Dell PowerEdge FX2平台可以实现后面8个PCI-E设备的灵活分配,从而更好的适配日益灵活的应用场景和业务需求。

    展开全文
  • C语言switch case语句详解

    万次阅读 多人点赞 2020-02-22 10:36:58
    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决。 当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对...

    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决。

    当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        if(a==1){
            printf("Monday\n");
        }else if(a==2){
            printf("Tuesday\n");
        }else if(a==3){
            printf("Wednesday\n");
        }else if(a==4){
            printf("Thursday\n");
        }else if(a==5){
            printf("Friday\n");
        }else if(a==6){
            printf("Saturday\n");
        }else if(a==7){
            printf("Sunday\n");
        }else{
            printf("error\n");
        }
        return 0;
    }
    

    运行结果:

    Input integer number:3↙
    Wednesday
    

    对于上述情况,在实际开发中一般使用 switch 语句代替,请看下面的代码:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n"); break;
            case 2: printf("Tuesday\n"); break;
            case 3: printf("Wednesday\n"); break;
            case 4: printf("Thursday\n"); break;
            case 5: printf("Friday\n"); break;
            case 6: printf("Saturday\n"); break;
            case 7: printf("Sunday\n"); break;
            default:printf("error\n"); break;
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    

    switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:

    switch(表达式){
        case 整型数值1: 语句 1;
        case 整型数值2: 语句 2;
        ......
        case 整型数值n: 语句 n;
        default: 语句 n+1;
    }
    

    执行过程:
    1 . 首先计算“表达式”的值,假设为 m。

    2 . 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。

    3 . 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。

    4 . 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。

    注意,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。例如:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n");
            case 2: printf("Tuesday\n");
            case 3: printf("Wednesday\n");
            case 4: printf("Thursday\n");
            case 5: printf("Friday\n");
            case 6: printf("Saturday\n");
            case 7: printf("Sunday\n");
            default:printf("error\n");
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    Friday
    Saturday
    Sunday
    error
    

    输入4,发现和第四个分支匹配成功,于是就执行第四个分支以及后面的所有分支。这显然不是我们想要的结果,我们希望只执行第四个分支,而跳过后面的其他分支。为了达到这个目标,必须要在每个分支最后添加break;语句。

    break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

    使用 break 修改上面的代码:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n"); break;
            case 2: printf("Tuesday\n"); break;
            case 3: printf("Wednesday\n"); break;
            case 4: printf("Thursday\n"); break;
            case 5: printf("Friday\n"); break;
            case 6: printf("Saturday\n"); break;
            case 7: printf("Sunday\n"); break;
            default:printf("error\n"); break;
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    
    

    由于 default 是最后一个分支,匹配后不会再执行其他分支,所以也可以不添加break;语句。

    最后需要说明的两点是:
    1 . case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。请看下面的例子:

    case 10: printf("..."); break;  //正确
    case 8+9: printf("..."); break;  //正确
    case 'A': printf("..."); break;  //正确,字符和整数可以相互转换
    case 'A'+19: printf("..."); break;  //正确,字符和整数可以相互转换
    case 9.5: printf("..."); break;  //错误,不能为小数
    case a: printf("..."); break;    //错误,不能包含变量
    case a+10: printf("..."); break;  //错误,不能包含变量
    

    2 . default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。

    如果感觉不错的话请点赞哟!!!

    展开全文
  • phy 驱动与 switch 驱动

    千次阅读 2020-06-03 10:39:59
    phy 驱动与 switch 驱动 phy 驱动 phy 与 cpu 的硬件连接 一般为 MAC-PHY 模式: MAC -PHY 之间使用 RGMII /MII 接口连接,用于传输数据。 SMI 接口,通常为 MDIO 接口或 I2C接口,用于读写PHY上面的寄存器。 - ...
  • switch语句

    万次阅读 多人点赞 2021-05-27 19:36:27
    switch语句目录一、switch语法结构1、语句结构2. switch嵌套二、switch语句规则三、switch语句格式解释四、用好break语句 目录 一、switch语法结构 1、语句结构   switch语句从字面上讲,可以称为开关语句,是一种...
  • switchhosts使用

    千次阅读 2022-03-15 18:06:42
    1、安装好switchhosts后,点击加号, (点击行号也可以注释) 首先测试下,打开命令行窗口,使用ping命令,来ping一下www.baidu.com的域名 没有配置host请求的时候,可以看到ping www.baidu.com的时候,对应...
  • 安卓 android 自定义 switch button,滑动开关,绝对漂亮美观
  • Switch模拟器调研

    千次阅读 2022-02-04 00:01:51
    笔者有个日版switch,今天在看steamy上《命令与征服 重绘版》的游戏介绍时,忽然想switch是上是否有这个游戏,在找资料时,发现网上竟然有switch的模拟器,遂整理了以下这个文档 手机端和电脑端的模拟器都有 手机...
  • golang switch使用

    千次阅读 2021-11-22 20:46:53
    switch语句结构 switch表达式 { case 表达式1,表达式2,...: 语句块1 case 表达式3,表达式4,...: 语句块2 这里可以有无限个case语句 default: 语句块 } //案例: // 请编写一个程序,该程序...
  • Switch使用方法

    千次阅读 2021-03-26 14:30:25
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、switch语句用法注意事项,如何正确使用switch语句? 二、使用步骤 1.使用default语句 2.使用 3.嵌套使用 3.tips 总结 前言 相...
  • C语言switch语句

    千次阅读 2021-05-21 10:32:09
    本篇文章帮大家学习c语言switch语句,包含了C语言switch语句使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。C语言中的switch语句用于从多个条件执行代码。 就像if else-if语句一样。...
  • switch语句使用

    千次阅读 2021-06-09 08:06:46
    在C语言中,switch语句是开关语句,一般与case、break、default配合使用,对流程进行控制。 switch语句的语法规则: switch ( 变量表达式 ) { case 常量1 :语句;break; case 常量2 :语句;break; case 常量3 :语句;...
  • switch范围判断、switch区间判断

    千次阅读 2021-08-16 11:40:18
    大家都知道switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。 很多情况下需要用到case区间判断,比如0-3的,大家可能回写...
  • Nintendo Switch可以仅将一部分数据进行初始化。初始化缓存与账号关联或发布截图和视频至社交平台时,将在主机中打开网页。初始化缓存将清除在浏览网页过程中保存的ID、密码、Cookie、浏览记录等各种缓存数据。开始...
  • Switchhosts Mac 安装

    千次阅读 2022-05-02 10:37:12
    SwitchHosts! Mac版是一款管理切换编辑Mac系统hosts的工具。支持编辑mac hosts文件,自定义以及添加多个hosts文件配置,备份hosts文件 brew方式安装 在 macOS 上,也可以使用 brew cask 安装,命令如下: brew ...
  • C语言switch 语句

    千次阅读 多人点赞 2021-08-09 10:48:51
    C语言switch 语句switch 语句break switch 语句 C语言还提供了另一种用于多分支选择的 switch 语句, 其一般形式为: switch(表达式){ case 常量表达式 1: 语句 1; case 常量表达式 2: 语句 2; … case 常量表达式 ...
  • CSS布局HTML小编今天和大家分享一个switch语句的例子matlab中switch语句的用法例子matlab中switch语句看了好几本教材上的例子都未看懂核心,不知谁能提供if-else-end... switch-case语句的一般表达形式为: switch〈...
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    千次阅读 2022-01-07 13:46:37
    1. Switch / Xbox / PS / PSV / PSP - 对比分析 - table 1.PSV2000 / 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20%,轻了15%。 ​ 屏幕改为液晶屏。 ​ PS键,开始键和选择键变成球形更方便按。 ​...
  • JAVA中的switch

    千次阅读 2022-01-17 11:33:28
    switch case 语句有如下规则: switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开 始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面 量。 switch 语句...
  • C语言中的switch语句基本用法

    万次阅读 2022-04-02 14:18:46
    switch语句: 实际生活中,需要做出很多选择,大家都知道做选择可以使用if语句,但是如果选择太多,if语句使用起来就会很繁琐,这个时候就需要一个能将代码简化的语句,也就是我们今天的主角switch语句。 switch...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,557,735
精华内容 623,094
关键字:

switch